Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Flaristan
Было бы легче, если бы знать кусок пояснения к чему это, и видеть полный текст.
Очевидно имеется в виду, что если у нас есть монстры к примеру с тагами «TAG001» и «NPC_TAG002», то точки их респавнов будут обозначаться вейпоинтами с тагами соответственно «WPR_TAG001» и «WPR_TAG002».

Пойдут или не пойдут – решает уже сам разработчик. Тот простенький скрипт сделанный в скриптгенераторе, который я предложил - не универсален.
Хорошо если задумка описанной точки респавна при входе в локацию игрока спавнить ему противника по штуке на игрока без заморочек, но если это особый противник вроде босса? Тогда получится: зашел 1 игрок на локацию и стал драться с ним, и тут на локацию заходит другой игрок - внезапно появляется еще один босс на голову первому игроку. А если заходит отряд в 10 человек – появятся 10 боссов. А если в локацию зашел один игрок, не смог убить монстра и убежал, и тут в локацию приходит второй игрок – он монстра еще не убивал и получится у него отреспится и свой монстр и на локации будет еще тот которого отреспил предыдущий игрок.
В общем, делая для мультиплеера, приходится учитывать кучу нюансов относительно конечного вида реализации своих задумок. Как правило, для качественного внедрения единичной идеи требуется прописывание айсберга неявных нюансов удерживающих эту идею именно в той форме, которая была задумана. Чтоб успешно заниматься этим - одного владения «скрипт-генератором» мало, нужно быть на «ты» с НВН-скриптингом.

Поставить 4 сундука; написать скрипт, который при открытии сундука единожды на смерть босса находящегося рядом генерирует в нем определенные вещи в определенном количестве, и если вещи уже лежат в сундуке при новом открытии после новой смерти босса – добавлять в их свойства определенные заранее улучшения; развесить этот скрипт на эти 4 сундука. smile.gif
ReZkiy
Подскажите - как заставить катапульту стрелять огненными шарами?Или метеоритным штормом? Плиз дайте скрипт!
gennady
Для балист и катапульт
Neverwinter Script
void main()
{
object oBal = OBJECT_SELF;
object oZel = GetNearestObjectByTag("ZEL_BAL");//Объект на который должен быть скастован спелл.

if (GetIsObjectValid(oZel) && GetDistanceToObject(oZel) <= 50.0f
    && GetLocalInt(oBal,"BALL") != 1)
{
  SetLocalInt(oBal,"BALL",1);
  PlaySound("as_cv_winch1");
  DelayCommand(15.3, SetLocalInt(oBal,"BALL",FALSE));
  if (GetTag(oBal) == "CATAPULTA")
  AssignCommand(oBal,ActionCastSpellAtObject(SPELL_F
IREBALL,oZel));
  else
switch (Random(2)+1)
{
case 1:
AssignCommand(oBal,ActionCastSpellAtObject(SPELL_F
LAME_ARROW,oZel));
break;
case 2:
AssignCommand(oBal,ActionCastSpellAtObject(SPELL_M
ELFS_ACID_ARROW,oZel));
break;
}
}
}

Спец скрипт для мощной катапульты
Neverwinter Script
void main()
{
object oPC = GetFirstPC();
object oBal = OBJECT_SELF;
int i = 1;
object oZel = GetNearestObject(OBJECT_TYPE_CREATURE, oBal, i);
vector vFace = GetPosition(oPC);

if (GetArea(oPC) != GetArea(oBal)) return;
if (GetLocalInt(oBal,"BALL") == 1) return;

while(GetIsObjectValid(oZel))
{
int iRepa = GetReputation(oZel, oBal);
if (iRepa < 40)
{
if (GetDistanceToObject(oZel) <= 23.0 && !GetIsDead(oZel))
{
  if (GetDistanceToObject(oZel) <= 3.0) return;
  effect eDamage = EffectDamage(GetCurrentHitPoints(oZel)/5, DAMAGE_TYPE_BLUDGEONING);
  effect eIMM = EffectSpellResistanceDecrease(30);
  AssignCommand(oBal, SetFacingPoint(vFace));
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eIMM,o
Zel,5.0);
  PlaySound("cb_sh_ballista");
  DelayCommand(0.5, AssignCommand(oBal,ActionCastSpellAtObject(SPELL_M
AGIC_MISSILE,oZel)));
  DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oZel));// Наносим удар
  DelayCommand(3.0, PlaySound("as_cv_winch1"));
  DelayCommand(11.0, SetLocalInt(oBal,"BALL",FALSE));
  SetLocalInt(oBal,"BALL",1);
  break;
}
}
i++;
oZel = GetNearestObject(OBJECT_TYPE_CREATURE, oBal, i);
}
}

Скрипты стоят на ХБ
ReZkiy
Цитата(gennady @ Feb 18 2012, 15:35) *
Спец скрипт для мощной катапульты
Neverwinter Script
void main()
{
object oPC = GetFirstPC();
object oBal = OBJECT_SELF;
int i = 1;
object oZel = GetNearestObject(OBJECT_TYPE_CREATURE, oBal, i);
vector vFace = GetPosition(oPC);

if (GetArea(oPC) != GetArea(oBal)) return;
if (GetLocalInt(oBal,"BALL") == 1) return;

while(GetIsObjectValid(oZel))
{
int iRepa = GetReputation(oZel, oBal);
if (iRepa < 40)
{
if (GetDistanceToObject(oZel) <= 23.0 && !GetIsDead(oZel))
{
  if (GetDistanceToObject(oZel) <= 3.0) return;
  effect eDamage = EffectDamage(GetCurrentHitPoints(oZel)/5, DAMAGE_TYPE_BLUDGEONING);
  effect eIMM = EffectSpellResistanceDecrease(30);
  AssignCommand(oBal, SetFacingPoint(vFace));
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eIMM,o
Zel,5.0);
  PlaySound("cb_sh_ballista");
  DelayCommand(0.5, AssignCommand(oBal,ActionCastSpellAtObject(SPELL_M
AGIC_MISSILE,oZel)));
  DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oZel));// Наносим удар
  DelayCommand(3.0, PlaySound("as_cv_winch1"));
  DelayCommand(11.0, SetLocalInt(oBal,"BALL",FALSE));
  SetLocalInt(oBal,"BALL",1);
  break;
}
}
i++;
oZel = GetNearestObject(OBJECT_TYPE_CREATURE, oBal, i);
}
}

Слушай, а важно ли здесь что бы катапульта или баллиста как плейсбл была используемая?
gennady
Важно, т.к. скрипт стоит на ХБ и катапульты кастуют спелы.
Flaristan
Для того, чтоб плейсбл мог кастовать спеллы, он не должен быть «статик» - но при этом он может быть не «активным».
Используй только галочку «сюжетный», если хочешь, чтоб катапульты нельзя было разрушить, и он будет как статик, колдующий спеллы.
ReZkiy
Цитата(Flaristan @ Feb 19 2012, 20:27) *
Используй только галочку «сюжетный», если хочешь, чтоб катапульты нельзя было разрушить

Cпасибо, это я понял ОООЧЕНЬ давно.
Насчет катапульты... Я в скриптах не очень, но - там есть функция, что бы она стреляла в НПС вражеских?
redlist2009
Всех приветствую!Возник вопрос.Прошу прощения,если пишу не туда...
Вопрос:необходимо,чтобы НПС появился после выполнения какого-либо действия,а не сразу при запуске модуля(например,через присвоение ему локальной переменной).То есть,поговорил с каким-нибудь челом,и,в указанном месте появился новый НПС.Ещё,хотел спросить:как заставить появиться НПС при наступлении ГГ на определённый участок локации?То есть,созданная мною группа НПС через "Мастер встреч",появлялась после выполнения разговора с кем-либо.Заранее,спасибо за помощь declare.gif
Valeroy
Здраствуйте, извините может не туда пишу, но у меня серьезный вопрос, мне нужен человек который бы объяснил по скайпу как работать со скриптами, для меня это не знакомо, поэтому прошу строго не судить если я обратился с этой просьбой суда, просто у меня хорошая идея для создания онлайн-модуля, но без скриптов ни как, хорошо отблагодарю человека который сможет помоч, пишите суда или скайп nemi44441
denis0k
redlist2009, все эти моменты разжёваны по 100 раз, тут огромная база примеров smile.gif В качестве наводки:
- Для выполнения действия в ветке диалога есть соответствующий слот для скрипта.
- Для выполнения действия в определённом месте локации есть слот OnEnter у триггеров, который там надо заранее нарисовать.
- Создать объект в скрипте можно функцией типа CreateObject по его resref-у, который можно подглядеть в палитре.
- Можно распотрошить оригинальную кампанию, там есть такие ситуации. Если ты конечно её проходил.

На подобные вопросы тут неохотно отвечают, т.к. это всё есть в мануалах.

Valeroy, говорю как преподаватель информатики (в т.ч. и программирования) - если ты совсем ничего не понимаешь в программировании, то обучить тебя этому за пару вечеров в скайпе невозможно в принципе. Самый действенный вариант - заинтересуй кого-нить своей идеей, тут 100% несколько скриптеров без дела шатается. Если идея интересна не только тебе, может выйти положительный результат.
redlist2009
denis0k, спасибо за совет,но,в этом и проблема...Я запутался во всём этом...Или,вы,меня не правильно поняли.Постараюсь объяснить.Все,наверное,играли в The Elder Scrolls 4 Oblivion.Так вот,кто помнит,в конце игры на имперский город нападают демоны...Именно это мне нужно...То,что,вы,мне сказали-я знаю...И,по поводу диалогов,и,по поводу триггеров...Я не знаю,что именно нужно писать в скипте.
PaiNt
Цитата(redlist2009 @ Feb 23 2012, 14:50) *
denis0k, спасибо за совет,но,в этом и проблема...Я запутался во всём этом...Или,вы,меня не правильно поняли.Постараюсь объяснить.Все,наверное,играли в The Elder Scrolls 4 Oblivion.Так вот,кто помнит,в конце игры на имперский город нападают демоны...Именно это мне нужно...То,что,вы,мне сказали-я знаю...И,по поводу диалогов,и,по поводу триггеров...Я не знаю,что именно нужно писать в скипте.

Вообще.. имхо такие вопросы говорят о непостижении дзена тулсета, посозерцайте побольше контента и понимание придет само.
denis0k
Дело не в дзен самого тулсета. Программирование - наука непростая, нахрапом её не взять. Это требует наличия некоторых знаний, которых в одном-двух абзацах не описать. Если лень найти в инете хотя бы лекции по программированию для школьников (не говоря о мануале по программированию на нвскрипт), то тут поможет только специально дресобученный скриптер в команде. Это сэкономит время, силы и нервы всем.
Valeroy
Мне на самом деле много не надо, около 5-ти скриптов, которых сам сделать не смогу, я даже готовые скрипты с города мастеров поставить не могу, они у меня не ребатают, говорю о скриптах на респ мобов, если у кого есть время в воскресенье или понедельник пишите мне в скайп Nemi44441 эти дни я буду дома, пока мне нужно только скрипт на респ мобов, тут мне к сожалению не объяснить, так как я большенства терминов не знаю, к тому же у меня модуль с непонятным переводом
Valeroy
Доброе время суток, извините может пишу не в ту тему, но знаю тут быстро могут помочь, я запустил сервер, но другие игроки не могут его увидет, в чем может быть проблема это на линуксе
Flaristan
Не все IP одинаково полезны: если у тебя динамический или внутрисетевой (серый), то подключиться к тебе по интернету на него не смогут – нужен приватный (белый).

Может помочь прога для создания виртуальной LAN сети «хамачи» - если ее установят, запустят и настроят все нужные пользователи, они смогут подключиться к твоему серверу с любым физическим IP. Скачать можно например тут.

P.S.: Хамачи не переваривает маршрутизаторы/роутеры.
PaiNt
Цитата(Flaristan @ Feb 26 2012, 09:56) *
Не все IP одинаково полезны: если у тебя динамический или внутрисетевой (серый), то подключиться к тебе по интернету на него не смогут – нужен приватный (белый).

Может помочь прога для создания виртуальной LAN сети «хамачи» - если ее установят, запустят и настроят все нужные пользователи, они смогут подключиться к твоему серверу с любым физическим IP. Скачать можно например тут.

P.S.: Хамачи не переваривает маршрутизаторы/роутеры.

Вообще не факт. Динамический айпи - не запрещает подключение к твоему серверу априори, просто у тебя будет менятся айпи всякий раз когда упадет твое подключение к интернету. Как показывает практика на динамическом айпи с адсл можно какое-то (ну для прохождения 2-х часового модуля например) время поднять даже сервер с NWNX на линуксе smile.gif, другое дело что это извращение - сообщать во аське впри каждом обрыве новый внешний айпи smile.gif..
Valeroy
Народ, шард готов, дайте пожалуйста готовый скрипт на респ мобов, по триггеру не хочу, нужен обязательно скрипт, и опишите его как поставить, и пожалуйста без терминов, на простом языке
Flaristan
Цапу крути.

P.S.: Самую ржавую.
Vermilion
Здравствуйте. У меня возникла одна ситуация по поводу скрипта.
Хочу сделать респ нпс (крыса с ResRef: "rat") через OnDeath скрипт на определенном WP:

script1 (OnDeath):

CODE

#include "script2"
void main()
{
string sResRef = ("rat");
location lSpawn = GetLocation(GetWaypointByTag("SPAWN01"));
DelayCommand(10.0, CreateObjectVoid(OBJECT_TYPE_CREATURE, sResRef,lSpawn));
///////////////////////////////////////////////////////
ExecuteScript("nw_c2_default7", OBJECT_SELF);
}


script2 (include в OnDeath):

CODE

void CreateObjectVoid(int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE)
{
object oVoid = CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation);
}


Сейчас у меня нвн версии 1.69, несколько лет назад делал ту же самую систему на версии 1.68 и всё работало. Конкретно, система заключается в том, что на локации размещается, допустим, 8 крыс и под каждой из них WP респа. На HeartBeat каждой из них вешается RandomWalk (если вне боя). Строка первого скрипта "location lSpawn..." определяется через case из 8 WP, получается, если убить все 8 крыс, возможно на каком-нибудь из WP крыс может быть 3-4 и так далее. Своеобразное разнообразие. Но это ладно...

Проблема в том, что у меня не получается сделать DelayCommand в первом скрипте больше, чем на 5.0 секунд. Когда ставлю 4.99, убиваю крысу, она появляется. Ставлю 5.01, убиваю, ничего не происходит, не респится. На модуле, на локации, на крысе нет никаких дополнительных скриптов или других изменений.
Ставил на этот OnDeath скрипт крысы визуальный эффект (маг. взрыв на GetLastKiller), он так же не работает, если DelayCommand больше, чем 5.0 секунд.
Ставил DelayCommand 10 секунд просто на Placeable: OnUsed, всё работает.

Не знаю, чем это всё вызвано. Помогите, кто знает.
gennady
Это настройка уничтожения трупа... Лучше вешать команду на модуль, а не крысу. Через: AssignCommand
Vermilion
Это тогда на HeartBeat?
Flaristan
Gennady походу имеет в виду, что если крыса (труп) уничтожается моментально после смерти, то по прохождению задержки превышающей остаток раунда в котором это происходит (больше 5 секунд) – скрипту не с чего запуститься т.к. его объект носитель перестает существовать. Чтоб этого избежать, нужно отдавать команду запуска скрипта не по умолчанию, как в продемонстрированном примере (подразумевающую OBJECT_SELF), а через «assign» с указанием лица стороннего объекта запуска, который будет продолжать существовать и после смерти крысы (например от лица вейпоинта респа или локации и т.п.).
PaiNt
Цитата(Flaristan @ May 31 2012, 07:47) *
Gennady походу имеет в виду, что если крыса (труп) уничтожается моментально после смерти, то по прохождению задержки превышающей остаток раунда в котором это происходит (больше 5 секунд) – скрипту не с чего запуститься т.к. его объект носитель перестает существовать. Чтоб этого избежать, нужно отдавать команду запуска скрипта не по умолчанию, как в продемонстрированном примере (подразумевающую OBJECT_SELF), а через «assign» с указанием лица стороннего объекта запуска, который будет продолжать существовать и после смерти крысы (например от лица вейпоинта респа или локации и т.п.).

лучше вешать действия не на вейпойнты smile.gif. не доверяю я им smile.gif
Virake
доброго всем времени суток!
недавно решил, наверное, в 7 раз переделать заново один мой модуль. и внедрить в него стандартную систему имитации жизни (AMBIENT_ANIMATIONS). уже когда-то делал такое, но немного подзабыл, что к чему. короче, столкнулся с такой проблемой: все НПЦ начинают "жить" только после того, как увидят игрока. т.е. они не выходят из домов, пока к ним не заглянет ПК. и это при том, что все, что нужно, подготовлено: все вейпы стоят на местах, все нужные переменные присвоены. ОнСпаун-скрипт тоже отредактирован соответствующим образом. переменная FLAG_CONSTANT, по-идее, должна включать "постоянную" жизнь НПЦ, т.е. они ходят и проигрывают анимции даже, если ПК нет рядом. однако почему-то не работает. как это исправить?
PaiNt
Цитата(Virake @ Jun 19 2012, 07:35) *
как это исправить?

досконально облазить каждое событие перед функцией WalkWayPoints() smile.gif, а еще лучше в ней ))
Melisse
Хербит отрубается в локациях, где нет игроков. Почему-то, хотя не должен. Бывает так - зашел НПС в дверь и все - обратно не выходит, пока игрок туда не наведается.
Можно извратиться через модульный хербит - на каждого НПС запускать скрипт, а не через их хербит.
Больше способов не знаю.
Flaristan
Он не «почему-то» отрубается, и это не только с НПС - а так же с объектами имеющими скрипты, визуальными эффектами и всем прочим. Это менеджмент ресурсами виртуальной машины сервера – она вообще может отключаться полностью пока в модуль не зайдет игрок. Обходить его не надо, потому что сделано было не просто так.

Виртуальному миру и не нужно собсно жить без игрока: единственный корректный способ это исправить – это либо составление алгоритмов позволяющих AI снимать в любой запрашиваемый момент времени полную симуляцию состояния объекта и воссоздавать по запросу; либо составление алгоритмов универсального реагирования криттера на внешние условия (ну либо и то и то).
Для НПС первый вариант типа: «если время с момента запуска модуля = столько-то, то криттер появится там-то и сделает то-то, имея при себе столько-то чего нада». Второй вариант типа: «если сейчас день, а у криттера нет того-то, то идем туда-то и берем чего нада, если оно есть, то идем куда-то еще и делаем что-то, пока не потратим чего надо, а если сечас ночь, притворяемся мертвым и храпим, пока не потыкают чтобы проверить». smile.gif

P.S.: ReZkiy, вообще я сейчас этим занимаюсь для онлайн модуля – может есть желание принять участие?
Virake
мне, по большому счету, и не нужно, чтобы НПЦ действовали, пока игрока нет в локации (это лишняя трата ресурсов). мне нужно, чтобы они: 1) ночью сидели дома; 2) днем ходили по городу. и первое, и второе сейчас работает, однако только, если за НПЦ следит игрок. если, скажем, группа НПЦ с наступлением темноты вернулась в дом, то на утро они от туда уже не выйдут, пока к ним не заглянет игрок. вот в этом вся проблема.
Flaristan
Я у себя создавал для этого «базы» для НПС – объекты которые управляют своим типом НПС на локации, на которой помещены. Банально гнезда и норы для животных, которые можно обнаружить и взаимодействовать на своем отдельном уровне.
Такой объект присутствует в модуле всегда и поэтому на него можно повесить скрипты позволяющие свободно удалять/респавнить криттеров без боязни срыва скриптов – в остальном сами криттеры автономны и используют скрипты «онхеартбита». Для «сна» криттеров я использовал команды «аппеар/дисаппеар» и на время ночи у меня птицы например попросту изчезают с локации («расселяясь» по гнездам), появляясь снова днем с учетом текущей популяции (новые птицы порциально спавнятся у гнезд по прохождению определенного периода времени с учетом установленного максимума популяции). Для команды «аппеар/дисаппеар» нет разницы в задержке (секунда или игровая ночь) так что в теории должно работать с НПС и их домами.

P.S.: Чтоб не получалось при этом так, что реакция AI воспринималась «тормознутой» - можно поставить заглушку которая при входе игрока на локацию, при условии что на ней уже нету другого игрока, спавнила/перемещала бы невидимые «базы» криттеров в точке присутствия игрока тем самым гарантируя 100% оперативность работы скрипта на ней отвечающего за актуальное местоположение криттера.
Melisse
Цитата
мне, по большому счету, и не нужно, чтобы НПЦ действовали, пока игрока нет в локации (это лишняя трата ресурсов). мне нужно, чтобы они: 1) ночью сидели дома; 2) днем ходили по городу. и первое, и второе сейчас работает, однако только, если за НПЦ следит игрок. если, скажем, группа НПЦ с наступлением темноты вернулась в дом, то на утро они от туда уже не выйдут, пока к ним не заглянет игрок. вот в этом вся проблема.


Нужно делать через хербит модуля или кастомный хербит каждые 6.0 сек на модуле.
Там беруться все НПС одной фракции или одного тега и кидаются днем туда, а ночью обратно. Только кушает процесс "перекидования" не мало.
Virake
склепал что-то такое:
Neverwinter Script
void main()
{

object oNPC = GetNearestObjectByTag("NW_COMMALE");
int nTime = GetTimeHour();
int nCount = GetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT");
object oSpawn = GetWaypointByTag("WP_NPC_SPAWN");
location lSpawn = GetLocation(oSpawn);

if (nTime >= 8 && nTime <= 18)
    {
    while (GetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT") < 8)
        {
        CreateObject(OBJECT_TYPE_CREATURE, "commale001", lSpawn);
        nCount += 1;
        SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount);
        }
    }
else
    {
    while (GetIsObjectValid(oNPC))
        {
        DestroyObject(oNPC);
        nCount -= 1;
        SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount);
        }
    }
}
вроде работает. днем они спавняться, а ночью исчезают. вот только исчезают они по-очереди (в отличии от появления) и с некоторым интервалом. и в это время игра немного подтормаживает, а еще в чат идут сообщения, что-то вроде "TOO MANY COMMANDS".

П.С. подозреваю, что дело в том, что скрипт пытаеться повторно анигилировать существо, пока оно еще не доконца исчезло, т.е. имеет Valid-статус. что с этим делать? можно было бы поставить задержку на несколько секунд, однако это не ускорит процес дестроинга.
Flaristan
«Слишком много инструкций» и далее таг объекта перегружающего кэш. Стандартное сообщение об ошибке когда происходит аварийная остановка выполнения скрипта – это значит его надо дорабатывать. smile.gif

P.S.:
Цитата(Virake @ Jun 19 2012, 16:25) *
Neverwinter Script
    while (GetIsObjectValid(oNPC))
        {
        DestroyObject(oNPC);
        nCount -= 1;
        SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount);
        }
В этом блоке не хватает идентификатора для oNPC он у тебя в условии 1 получается «ближайший по тагу» а циклу после 1 объекта нужна функция перешагивания к следующему. Для криттеров (включая ПС) я у себя использовал в аналогичном цикле как-то функцию GetNextObjectInArea в паре с условиями (для упрощения нагрузки):
Neverwinter Script
oTarget = GetFirstObjectInArea(oArea);
   while(GetIsObjectValid(oTarget))
        {
        //сюда можно поставить любое условие хоть по тому же тагу
        if (GetIsPC(oTarget))
           {
           //сюда то что тебе нужно сделать с объектом
           }
        oTarget = GetNextObjectInArea(oArea);
        }
Virake
действительо, теперь работает. спасибо за помощь.

П.С. однако полноценной системой это пока считаться не может. нужно внедрить:
1) чтобы спавнились случайные НПЦ
2) чтобы они спавнились по случайным вейпам
3) чтобы перед дестроингом возвращались к своим спавн-точкам
Flaristan
1. Не сложно реализовать, заменив резреф криттера на стринговую переменную определяющуюся дополнительным блоком скрипта ранее, из списка заготовленных резрефов.
(хотя ИМХО лучше не случайные условия а причинно следственные)
2. То же самое.
(и опять таки лучше снабдить кузницу наковальней которая будет респить кузнеца, улицу мусоркой которая будет респить дворника и т.п. – как минимум меньше будет нервотрепки с рендумной неопределенностью)
3. Именно поэтому удобна функция «аппеар/дисаппеар» - она не удаляет/респавнит объект, а переносит его в нужную позицию с какой угодно задержкой при необходимости.
(а если просто нужна видимость сворачивания деятельности – то тут перед ним можно поставить парочку контрольных «велков» к нужному объекту, если в локации присутствует ПС; но как правило рано или поздно НПС все равно найдет способ застрять на глазах у ПС и испортить все впечатление от AI – хорошим решением для этого является тематическое преподнесение «дисаппиар» эффекта, например птицы у меня взлетают в воздух прежде чем пропасть)
Sugo77
Привет!
И снова я с вопросами о скриптах на респавн мобов!

Вот есть рабочий скрипт под НВН1-НВН2(Меня интересует сейчас НВН2), вроде ставиться в OnDeath мобов(Скрипт сохраяеться без ошибок на F7, но ничего не происходит в игре-мобы не спавняться на точку, через заданные 6 секунд в скрипте), что задавать в WayPoint?
Код
                  #include "nw_i0_2q4luskan"
               void main()
{
    object oSelf = OBJECT_SELF;
    string sResRef = GetResRef(oSelf);
    string sResPoint = GetLocalString(oSelf, "RESPAWN_POINT");
    location lLoc = GetLocation(GetWaypointByTag(sResPoint));
    AssignCommand(GetModule(), DelayCommand(6.0f, SetLocalString(CreateObject(OBJECT_TYPE_CREATURE, sResRef, lLoc), "RESPAWN_POINT", sResPoint)));
}


Подскажите пожалуйста, в чём загвоздка?!

Просто я всё подзабыл, помню, что в НВН1-всё получалось-без проблем, но сейчас занялся НВН2, и там не выходит респавн моба на точку, после убийства...
Уже второй день мучаюсь, подскажите, пожалуйста...

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

Добавлено позже:
Уже сам разобрался...
Sugo77
Добавил позже(Пару дней спустя):
Всё, сам во всём разобрался!

Всем спасибо!

Всех с праздниками!

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

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

Может есть какой-то скрипт для выполнения данной задачи?

Заранее спасибо!
Sugo77
Подскажите такой скрипт.
Чтобы после убйства моба, не оставался лут, или, чтобы выпавший лут, самостоятельно исчезал, через заданное время.
И куда его вставлять?

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

Потому что без скрипта, в тулсете НВН 2-не нашёл другого способа, как такое сделать, изменение Body Bag на None-не помогает, лут всё равно остаётся с убитых мобов.

Потчитал форумы на английском, там кто пишет, что, что-то нужно менять в On Death, кто в On Spawn, что-то связанное с Random Treasure, но не один, не написал, что...
Добавлю, в On Death мобов у меня ужа забит скрипт на респавн мобов...

Промежуточный результат:
http://youtu.be/k7bxz0PxKow
gennady
Neverwinter Script
//:://////////////////////////////////////////////////
//:: Чистка локации от предметов, слот ХБ
//:: Created By: Gennady
//:: Name: de_chistka_loc
//:://////////////////////////////////////////////////
#include \"ludi\"
void ChistkaLoc(int iD, object oSelf = OBJECT_SELF)
{
object oItem = GetFirstObjectInArea(oSelf);
int iFut = Day()+iD;
int iDes = Day();

SetLocalInt(oSelf, &#092;"day\", iFut);
while(GetIsObjectValid(oItem))
{
   if(GetLocalInt(oItem,&#092;"day\")==0)
      SetLocalInt(oItem, &#092;"day\", iFut);
   if(GetLocalInt(oItem,&#092;"day\")<= iDes)
   {
     if(GetTag(oItem)==&#092;"BodyBag\")
     {
      object oItemB = GetFirstItemInInventory(oItem);
      while(GetIsObjectValid(oItemB))
      {
       if(GetPlotFlag(oItemB)==FALSE)
       DestroyObject(oItemB);
       oItemB = GetNextItemInInventory(oItem);
      }
     }
     else
     {
      if(GetObjectType(oItem)==OBJECT_TYPE_ITEM && GetPlotFlag(oItem)==FALSE)
      DestroyObject(oItem);
     }
   }
   oItem = GetNextObjectInArea(oSelf);
}
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
object oSelf = OBJECT_SELF;
int iD = StringToInt(GetLockKeyTag(oSelf));

if(GetArea(oPC)==GetArea(oSelf))  // если ПС в локе
  ChistkaLoc(iD);
else
if(GetLocalInt(oSelf,&#092;"day\") <= Day() && GetLocalInt(oSelf,&#092;"day\")!=0)
  ChistkaLoc(iD);
}

// Тэг ключа, врямя в днях до удаления предметов

Neverwinter Script
///////////////////////////////////////////////
//  ***  БИБЛИОТЕКА  ***        #include \"ludi\"
///////////////////////////////////////////////
// _______________  Текущий день _______________________________________________
int Day()
{
int nDay = GetCalendarDay();
int nMes = 28*GetCalendarMonth();
int nYear = GetCalendarYear();
int iDay = 336*nYear+nMes+nDay;
return iDay;
}
Flaristan
Я так понял вышеприведенный скрипт после заданного промежутка времени чистит все контейнеры на локации, на которой запущен. Однако особенность дефолтных лутбэгов (в НВН1 по крайней мере) такова, что они не подпадают в определение всех имеющихся в распоряжении движка идентификаторов – данный скрипт их не очистит.
Недавно сам такое делал и проверял: носитель лутбэга монстра отвечает определению самого монстра (имеет тот же таг и статус «мертвого существа» - фактически его мертвое тело), но после смерти носителя его лутбэг никакому влиянию не поддается (для стандартных скриптов на существе типа «онхертбита» после его смерти оно перестает «херт-бит» буквально и «ондэф» - это последний эвент которым можно что-то сделать) и его невозможно ничем «подцепить» в скрипте так, чтоб навязать манипуляции с ним. Они не выполняются. Попросту говоря сей объект в игре далее доступен только для ПС – сам движок лутбэг никак не видит. Можно удалить мертвое тело по тагу, заставить его исчезнуть или даже перенести в «лимбо» (что приведет к утрате всяческого доступа к его лутбэгу), но на полу при подсветке по табу все еще можно будет наблюдать силуэт его никуда не девшегося лутбэга. Единственный способ избавиться от стандартного лутбэга – вынуть все содержимое ПС-персонажем вручную.

Решается эта дилемма классически заменой дефолтного лутбэга искусственным, который спавнится в момент смерти существа (по триггеру «ондэф») и в который копируются все предметы из инвентаря умирающего существа; последние в свою очередь после копирования тут же удаляются, чтоб очистить инвентарь создающегося трупа и избежать создания дефолтного лутбэга.
Далее вы можете скриптами управлять трупом существа и искусственным лутбэгом с его содержимым вполне нормально и как вам заблагорассудится. А так же настроить время автоматического исчезновения трупа через настройки НПС.
greye
Цитата(Flaristan @ Jan 10 2013, 04:52) *
Попросту говоря сей объект в игре далее доступен только для ПС – сам движок лутбэг никак не видит. Можно удалить мертвое тело по тагу, заставить его исчезнуть или даже перенести в «лимбо» (что приведет к утрате всяческого доступа к его лутбэгу), но на полу при подсветке по табу все еще можно будет наблюдать силуэт его никуда не девшегося лутбэга. Единственный способ избавиться от стандартного лутбэга – вынуть все содержимое ПС-персонажем вручную.

Неверно. Все стандартные лутбеги имеют тег "BodyBag", по нему можно получить доступ к объекту (видимому или нет), очистить от итемов и удалить, что и наблюдается в скрипте gennady. Единственное, лутбег ещё не создан на момент срабатывания OnDeath, поэтому его либо приходится искать с задержкой, либо запускать чистку с "внешних" событий.
Flaristan
Ну, тогда все еще проще – можно поставить в локации блок на «онхеартбит» с заглушкой на выполнение скажем раз в игровые сутки, который попросту будет очищать все объекты с этим тагом на локации:..
Neverwinter Script
void main()
{
object oArea = OBJECT_SELF;
object oTarget = GetFirstObjectInArea(oArea);
object oItem;

if (GetTimeHour() == 0)
  {
  if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 0)
      {
      SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 1);
      }
      else
      {
      return;
      }
  }
  else
  {
  if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 1)
      {
      SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 0);
      }
  return;
  }

while(GetIsObjectValid(oTarget))
    {
    if (GetTag(oTarget) == "BodyBag")
        {
        oItem = GetFirstItemInInventory(oTarget);
        while(GetIsObjectValid(oItem))
            {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oTarget);
            }
        }
    oTarget = GetNextObjectInArea(oArea);
    }
}
Melisse
При большой загрузке модуля локациями, больше 100+ и большим кол-вом мобов ии других штук зависает время. Что будет в этом случае?))) - ты используешь GetTimeHour() smile.gif
Flaristan
Ну это вообще не проблема:
1) счетчик вообще можно поставить принципиально какой удобно;
2) зависающее время в модуле вроде чинят перематывая его искусственно, если оно заедает естественно.
Sugo77
1.: gennady , при сохранении Вашего скрипта, указывает на какую-то неточность\ошибку в данной строчке:
int iFut = Day()+iD;

И ещё, куда вставляется Ваш скрипт?

2.: А вот скрипт от Flaristan-прекрасно работает под НВН2, но!, уменьшить бы время задержки на исчезновения лута с локации, в его скрипте(Пока не могу дотумкать, как это сделать), а то сутки-это много, мне бы меньше минуты, то есть в секундах(Секунд: 30)...

Предпологаю, что что-то связанное с DelayCommand 6.0f(Значение времени, выдернутое мною из скрипта на респавн мобов), но куда это вставить, что на что заменить?, и будет ли это правильно работать в скрипте от Flaristan?

Заранее спасибо!
Flaristan
Верхний блок скрипта:..
Цитата(Flaristan @ Jan 10 2013, 11:48) *
Neverwinter Script
if (GetTimeHour() == 0)
  {
  if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 0)
      {
      SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 1);
      }
      else
      {
      return;
      }
  }
  else
  {
  if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 1)
      {
      SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 0);
      }
  return;
  }
…это просто заглушка которая не дает срабатывать скрипту каждые 6 секунд «онхеартбита» и позволяет выполнять условия для его запуска 1 раз в полночь по игровому времени. smile.gif
Если его заменить на такой блок:..
Neverwinter Script
int iCount = GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF));
if (iCount==5)
  {
  SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 0);
  }
  else
  {
  iCount++;
  SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), iCount);
  return;
  }
…он каждые 6 секунд «онхеартбита» будет считать переменную присваиваемую его локации с ее же мименем – как только досчитает до 5 (5 «онхеартбитов» по 6 секунд = 30 секунд) сбросит счет в «0» и выполнит дальнейший скрипт.

Можно через «DelayCommand» тоже, но мне показалось так проще и надежней.
Sugo77
Спасибо за помощь!
То что надо!, и всё работает!

Ещё бы с замками разобраться(В НВН2), ранее уже спрашивал:
Можно ли вообще, в принципе, сделать так, чтобы дверь снова закрыть на тот же ключ, которым открывал, любому классу, без соответствующих скиллов? Может, через какой-то скрипт? Так как облазил весь тулсет, не дотумкал, как это сделать обычным способом, получается только открывание замка, и дверь уже потом постоянно открыта-входи любой, а хотелось бы получить возможность, и снова закрыть эту же самую дверь, на этот же самый ключ...
gennady
Чистка локации от предметов
Тут что-то глючат коды NNS. Кому нужно смотрим здесь: http://remmgen.narod.ru/tmodul.html
Flaristan
Могу лишь предложить сделать на ключи «уникальную силу предмета» которая по юзу на дверь будет проверять ее ли это ключ, и если да – то закрывать ее на замок.

Если нужно просто чтоб двери через какое-то время закрывались и запирались – можно сделать соответствующий скрипт с задержкой на «онопен» и раздать его нужным дверям.

P.S.: И да - если уж отсылать то тогда еще мои две любимые ссылки на ресурсы которые помогли мне достигнуть того уровня скриптинга который сейчас имею:
- скрипт-генератор Лилака;
- Лексикон.
Sugo77
gennady, а вот скрипт с Вашего сайта-сработал!
Но там он в днях, а у меня трейниг модуль для спелл кастеров, где мобы с 10-100 ХП, убиваются за секунды, и спавняться, через 6 секунд, поэтому скрипт от Flaristan, мне более подходит!

А вообще, обоим участникам большое спасибо за помощь, и отзывчивость!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.