Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
-fenix-
Chimeric, убери галку "статик" !

QUOTE (Chimeric @ Oct 4 2005, 15:02)
Во-вторых (самокритика продолжается) не знаю, как заставить камеру увеличить масштаб. То есть не в роликах, а просто по появлении персонажа в зоне. Пусть дальше игрок увеличивает и уменьшает, как хочет, но в начале - крупный план. Идея в том, чтобы он, каждый раз появляясь в одном и том же месте, постоянно натыкался на увеличенный вид статуи в двух шагах. В двух-то в двух, а увеличение какое было до перемещения между зонами, такое и остаётся. Как поправить?


Например так
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();

AssignCommand(oPC, SetCameraFacing(30.0, 1.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP));
}
Chimeric
Спасибо громадное, Алиса и Феникс. Только куда вставить эти скрипты? Дело с приближением камеры в том, что нужно, чтобы происходило это только в некоторых случаях. То есть у меня имеется в зоне две точки, откуда персонаж прибывает из других зон. Напротив одной точки - статуя, и в этом месте мне хотелось бы увеличенного масштаба. Но другая точка прибытия - напротив массивной галереи, и тут уж, наоборот, желательно удаление камеры для пущего великолепия. Как мне это оформить?

Скажите уж, куда и скрипт для брони ставить. sad.gif В триггер на OnEnter? Или...
AliceDiren
Скрипт для брони поставь в модульных свойствах на OnAcquireItem.
Chimeric
Понятно. Только мне, в принципе, нужно такое проделать с тремя объектами. Там меч, шлем и броня в трёх лучах света. Это как будет?
AliceDiren
Neverwinter Script Source
void main()
{
object oItem = GetModuleItemAcquired();
string sItemTag = GetTag(oItem);
object oSpam = OBJECT_INVALID;

if(sItemTag == "Таг брони")//Подняли броню
  {
  oSpam = GetObjectByTag("AShaft");//Луч, в котором лежит броня
  DestroyObject(oSpam);
  }
if(sItemTag == "Таг меча")//Подняли меч
  {
  oSpam = GetObjectByTag("BShaft");//Луч, в котором лежит меч
  DestroyObject(oSpam);
  }
if(sItemTag == "Таг шлема")//Подняли шлем
  {
  oSpam = GetObjectByTag("SShaft");//Луч, в котором лежит шлем
  DestroyObject(oSpam);
  }
}


А лучше сделать подругому. Три скрипта, соответственно называющиеся scr_*, где * - это таг предмета.
Neverwinter Script Source
//Это для брони, для шлема и меча меняешь таг уничтожаемого объекта
void main
{
DestroyObject(GetObjectByTag("AShaft"));
}

И такой код:
Neverwinter Script Source
void main()
{
object oItem = GetModuleItemAcquired();
string sItemTag = GetTag(oItem);
object oSpam = OBJECT_INVALID;

ExecuteScript("scr_" + sItemTag, OBJECT_SELF);
}

Добавлено в [mergetime]1128506730[/mergetime]
Да, вот еще, я тоже делала подобное и добавляла перед тем как уничтожить объект, такой код:
Neverwinter Script Source
object oDstrObject = GetObjectByTag("AShaft");
ApplyEffectAtLocation(0, EffectVisualEffect(74), GetLocation(oDstrObject));
DelayCommand(1.0, ApplyEffectAtLocation(0, EffectVisualEffect(286), GetLocation(oDstrObject)));
DelayCommand(2.0, DestroyObject(GetObjectByTag("AShaft")));

Насчет Id эффектов я могу ошибаться, но имхо в объект должна ударить молния, экран хорошенько встряхнет и он (объект) исчезнет.
Chimeric
Не работает первый вариант почему-то. Вот примерный модуль, погляди: http://gweleif.narod.ru/Example.mod

Не обращай внимание там на другие скрипты и т.п.
-fenix-
Chimeric, я говорил
QUOTE (-fenix- @ Oct 4 2005, 17:37)
Chimeric, убери галку "статик" !

имеются ввиду лучи света
тогда все заработает victory.gif
Chimeric
Голосом Матроскина: урра, заработало!

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

CODE
void main()
{

object oPC = GetLastPerceived();

if (!GetIsPC(oPC)) return;

if (!GetLastPerceptionSeen()) return;
ActionSpeakString("Áåäíûé Ìàðêî! ×òî îíè ñ íèì ñäåëàëè!");

ActionWait(10.0f);

ActionSpeakString("À ìû òàê õîðîøî æèëè. Íî ÿ è Ïîëèêðàò íåìíîãî çàðàáàòûâàëè. Íå÷åãî óäèâëÿòüñÿ, ÷òî îí ñîáëàçíèëñÿ äåíüãàìè.");

ActionWait(10.0f);

ActionSpeakString("Â ýòîì ìèðå ïîäëîñòè íåò ïðåäåëà.");

ActionWait(10.0f);

ActionSpeakString("Êîãäà îí áûë ìàëåíüêèì, òî âñåãäà ïîìîãàë ìíå ïî äîìó. Âñåãäà.");

ActionWait(10.0f);

ActionSpeakString("Êàê-òî îí óïîìÿíóë, ÷òî ïîçíàêîìèëñÿ ñ î÷åíü âàæíûì ÷åëîâåêîì, à ÿ, èäèîòêà, íå îáðàòèëà âíèìàíèÿ.");

ActionWait(10.0f);

ActionSpeakString("Õëîÿ ïðîñòî íå äàâàëà åìó ïðîõîäà.");


biggrin.gif Это должно запускать на OnPerception. Человечек пишет над головой фразу, ждет время, пишет еще фразу и так далее. Второй:

CODE
void main()
{

object oPC = GetEnteringObject();

if (!GetIsPC(oPC)) return;

int DoOnce = GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF));

if (DoOnce==TRUE) return;

SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), TRUE);

RewardPartyGP(200, oPC, FALSE);

object oTarget;
oTarget = GetObjectByTag("globe1");

//Visual effects can't be applied to waypoints, so if it is a WP
//apply to the WP's location instead

int nInt;
nInt = GetObjectType(oTarget);

if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_DISPEL_GREATER), oTarget);
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_DISPEL_GREATER), GetLocation(oTarget));

DestroyObject(oTarget, 3.0);

FloatingTextStringOnCreature("200 çîëîòûõ", oPC);

}


Этот должен при наступлении на триггер "globe1" уничтожить предмет "globe1" со спецэффектом Greater Dispelling, высветить "200 золотых" у игрока над головой и дать ему столько же.
Aiwan
QUOTE (Chimeric @ Oct 8 2005, 10:44)
Это должно запускать на OnPerception. Человечек пишет над головой фразу, ждет время, пишет еще фразу и так далее.

Любое действо может сбить акции. И он не скажет ничего кроме первых фраз.
Neverwinter Script Source
oTarget = GetObjectByTag("globe1");

Если в модуле есть еще хоть один предмет с таким тагом, то не сработает.
Вишес
не могу сделать скрипт, прекращающий драку и начинающий диалог.
мой вариант.
Neverwinter Script Source
void main()
{
if (GetCurrentHitPoints(OBJECT_SELF)< 4)
{
object oPC = GetAttackTarget(OBJECT_SELF);
AssignCommand(OBJECT_SELF, ActionSpeakString("Ñòîé!"));
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(OBJECT_SELF, ClearAllActions(TRUE));
ChangeToStandardFaction(OBJECT_SELF,STANDARD_FACTION_DEFENDER);
AssignCommand(OBJECT_SELF,ActionStartConversation (oPC));
}
}

бой останавливается, начинается диалог, но непись почему-то остается враждебным
Я знаю, это где-то уже было. Но не могу найти. скажите, что не так или дайте ссылку, пожвлуйста.
NedWarN
2Вишес
Дело в том что движок, НВНа не позваляет, говорить с НеПиСем, примо после боя. нужно переждать 3-5 секунды.
тогда непись сможет говорить.попробуй мой скриптик я его не тестил. поставь на ОнДифер Непися.
Neverwinter Script Source
void main()
{
object oPC = GetLastAttacker();
object oNPC = OBJECT_SELF;
int iNPC = GetUserDefinedEventNumber();
if(iNPC == 1006)
{
int iMaxHP = GetMaxHitPoints();
int iCurrHP = GetCurrentHitPoints();
if (GetLocalInt(OBJECT_SELF,"ZDES") == 0)
if((iCurrHP * 3) <= iMaxHP && GetLocalInt(OBJECT_SELF,"Surrender") == 0)
{
AdjustReputation(OBJECT_SELF,oPC, 100);
AdjustReputation(oPC,OBJECT_SELF, 100);
SurrenderToEnemies();
AssignCommand(GetLastAttacker(), ClearAllActions());
SetLocalInt(OBJECT_SELF,"Surrender",1)   ;
SpeakOneLinerConversation();
DelayCommand(0.0,AssignCommand(oNPC, SpeakString("Ìîß íå õîòåòü äðàòñß")));
ActionWait(2.0);
AssignCommand(oNPC, ActionStartConversation(oPC, "Òàã Äèàëîãà"));
SetLocalInt(OBJECT_SELF,"ZDES",1);
}
}
}
Chimeric
QUOTE (Aiwan @ Oct 8 2005, 09:53)
Любое действо может сбить акции. И он не скажет ничего кроме первых фраз.

Ну там никакое действо невозможно. Разве что персонаж нападет на NPC, но я его сделал неуязвимым. А так - диалога нет, анимаций тоже, стоит дядя и бормочет... Так как все-таки оформить, чтобы заработало? Или дело в тарабарщине, в которую превращаются русские шрифты в редакторе скриптов? UNKNOWN STATE IN COMPILER. Но что делать? В Опциях нет варианта для русского языка. Шрифты-то у меня стоят, разговоры по-русски и описания предметов читаемы, а вот со скриптами не знаю.

Под "предметом" ты имеешь в виду любую вещь? У меня у самого триггера такой же tag, globe1. Поменять? Или это разные категории?
Aiwan
QUOTE (Chimeric @ Oct 8 2005, 23:04)
Под "предметом" ты имеешь в виду любую вещь? У меня у самого триггера такой же tag, globe1. Поменять? Или это разные категории?

Меняй.
Белатрис
Всем здрасте.
Я здесь новичок, и модули начел создавать недавно, и у меня ничего не получалось. Времени нет листать 63 страницы, так что не сердитесь если мои вопросы будут похоже на те что уже были заданы. good.gif
1. Как составить скрипт, что бы человек сидел на троне.
2. Камера... до меня не может дойти как сделать мультфильм, расскажите пожалуйсто.
Lemegeton
QUOTE (Белатрис @ Oct 9 2005, 00:04)
1. Как составить скрипт, что бы человек сидел на троне.

Используй ф-цию
CODE
ActionSit(object oChair)

Например:
CODE
ActionMoveToObject(oChair);
SpeakString("Here's my seat!");
ActionSit(oChair);

Чел сядет на стул, заданый объектом oChair.
Вишес
NedWarN
зачем так сложно?
а вообще спасибо.
я впаял в середину своего скрипта
SurrenderToEnemies();

и еще немного изменил - и все заработало.
Белатрис
Lemegeton, спасибо.
Chimeric
Ладно, скрипт с globe1 заработал. А как же все-таки заставить NPC бормотать линии с интервалами секунд по 10? Желательно закольцевать это дело, чтобы по кругу гундели. Тут вот еще что:

CODE
void main()
{

object oPC = GetEnteringObject();

if (!GetIsPC(oPC)) return;

if (GetLocalInt(oPC, "marco")>= 6)
  {
  if (GetLocalInt(oPC, "statuestatus")== 0)
     {

     oTarget = GetObjectByTag("statue");

//Visual effects can't be applied to waypoints, so if it is a WP
//apply to the WP's location instead

     nInt = GetObjectType(oTarget);

     if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
     else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));

     DestroyObject(oTarget, 3.0);

     oTarget = GetWaypointByTag("statuetag");

     lTarget = GetLocation(oTarget);

     oSpawn = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_statue2", lTarget);

     SetLocalInt(oPC, "statuestatus", 1);

     }
  }
else
  {
  SetLocalInt(oPC, "statuestatus", 1);

  }

}


Идея в том, чтобы при входе в зону проверялись две переменные, statue и marco, и если одна из них 0, а другая 6, то удалялся бы placeable, экран сотрясался и на его месте являлся другой объект, а переменная statue делалась бы 1 (чтобы не гонять скрипт снова и снова).

Пишет VARIABLE DEFINED WITHOUT TYPE на 20-й линии. Ошибка-то простая, но, видно, логика не моя стезя, никак не соображу, что добавить. Ненавижу скрипты. Я пока полез на позорный столб, а вы помогите, а? Гнилые помидоры вон в том ящике. rolleyes.gif
Lemegeton
Neverwinter Script Source
//Visual effects can't be applied to waypoints, so if it is a WP
//apply to the WP's location instead

     // nInt = GetObjectType(oTarget);
     int nInt = GetObjectType(oTarget); // <---- проблема тут.  Обязательно указывать тип переменной.

     if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);


Хы... И так везде... Попробуй так:
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;

if (GetLocalInt(oPC, "marco")>= 6) {
  if (GetLocalInt(oPC, "statuestatus")== 0) {
     object oTarget = GetObjectByTag("statue");
     int nInt = GetObjectType(oTarget);
     ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));  // Это наверняка на локацию.
     DestroyObject(oTarget, 3.0);
     oTarget = GetWaypointByTag("statuetag");
     location lTarget = GetLocation(oTarget);
     object oSpawn = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_statue2", lTarget);
     SetLocalInt(oPC, "statuestatus", 1);
   }
} else {
  SetLocalInt(oPC, "statuestatus", 1); // Это-то зачем? Получается, если не попадает в первое условие, предыдущие операторы никогда больше не сработают?
}

Уточни задачу. Решение явно не оптимальное. Если у тебя там уже есть оъект, ни к чему делать WayPoint...
Chimeric
Вообще-то верно, statuestatus лишний. Про локацию верно, только там уже статуя торчит. Скрипт должен ее заменить на другую. Я воткнул Waypoint поверх нее. Как это все будет выглядеть иначе? wacko.gif Я понимаю, кончно, что уж кучу вопросов про скрипты вывалил, но тороплюсь успеть к конкурсному сроку...
NedWarN
Челы, скриптёры, помогите. Я в шоке, написал скриптик а он не пашет, кто разяснит в чём проблема.
наОнХарб предметика.
Neverwinter Script Source
void main()
{
if(GetIsDay() && GetIsDawn() == TRUE)
{
PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
if(GetIsNight() && GetIsDusk() == TRUE)
{
object oSelf =GetObjectByTag("YYY_OIO_POIUN_1");
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
}
}
}
-fenix-
QUOTE (NedWarN @ Oct 9 2005, 16:34)
елы, скриптёры, помогите. Я в шоке, написал скриптик а он не пашет, кто разяснит в чём проблема. наОнХарб предметика.


Neverwinter Script Source
void main()
{
//Тут нужен не "&&" - как такое можеь быть? Нужно использовать "||" !!
if(GetIsDay() && GetIsDawn() == TRUE)
{// тут *
PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);


//Тут нужен не "&&" - как такое можеь быть? Нужно использовать "||" !!
if(GetIsNight() && GetIsDusk() == TRUE)
{
object oSelf =GetObjectByTag("YYY_OIO_POIUN_1");
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
}
}// и тут *
}

*-Получается, что ночь и вечер будет проверяться, только если сейчас утро или день!

Надо так

Neverwinter Script Source
void main()
{

if(GetIsDay() || GetIsDawn())
{
    PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
}

if(GetIsNight() || GetIsDusk())
{
    object oSelf =GetObjectByTag("YYY_OIO_POIUN_1");

    PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
    effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);

    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
}
}


Если это работа с освещением, то нужно еще использовать функции
Neverwinter Script Source
SetPlaceableIllumination (OBJECT_SELF, FALSE);
RecomputeStaticLighting (GetArea(OBJECT_SELF));
Aiwan
QUOTE (Белатрис @ Oct 9 2005, 03:04)
Времени нет листать 63 страницы, так что не сердитесь если мои вопросы будут похоже на те что уже были заданы.

Тут есть ПОИСК.
QUOTE (Белатрис @ Oct 9 2005, 07:17)
Lemegeton, спасибо.

А за такой "содержательный" пост, тут можно получить пред. biggrin.gif Это тебе на будущее...
А вообще, тут рады новичкам. Но они должны соблюдать правила.
2_advanced
кто-нибудь знает как реализовать невидимость кричи без потери визуальных эффектов? biggrin.gif
т.е. луч идет до кричи pardon.gif и она должна бегать по локации.. вместе с лучём swoon.gif
VFX_DUR_CUTSCENE_INVISIBILITY, хайд, 0-й вид частей тела не катит black eye.gif
Chimeric
Как же все-таки заставить NPC бормотать фразы-линии?
Aiwan
Задержки ставь свои.
Neverwinter Script Source
object oUbo = GetObjectByTag("AM_CUT2_UBO");
    object oHalib = GetObjectByTag("AM_CUT2_HAL");

    DelayCommand(17.0, AssignCommand(oHal, SpeakString("Фраза #1.")));
    DelayCommand(18.5, AssignCommand(oUbo, SpeakString("Фраза #2.")));
    DelayCommand(20.0, AssignCommand(oHal, SpeakString("Фраза #3")));
    DelayCommand(22.0, AssignCommand(oHal, SpeakString("Фраза #4.")));
Chimeric
Кстати, вот еще вопрос: как запретить Respawn в сингле? Наверняка в архивах уже есть ответ, но местная функция поиска, мягко говоря, оставляет желать лучшего. Просматривать две нитки по 60 страниц каждая - извините... Тем более, что Мастерам скриптов мне подсказать ничего не стоит. Итак: как сделать так, чтобы при смерти персонажа не появлялось обычной панели с кнопками? Или пусть появляется, но без опции "Respawn", если это возможно. Хочу дать понять игроку, что чем нарываться на неприятности и врагов в расчете на воскрешение, лучше сохраняться почаще и разумно оценивать свои возможности.

Если нельзя изменить интерфейс, то идеально было бы запустить ролик с титрами и выйти в главное меню.

P.S. Спасибо, Айван. Эти реплики будут крутиться до бесконечности? И куда ставить скрипт - в OnPerception?
Вишес
Chimeric

QUOTE
как запретить Respawn в сингле?


Очень просто.
В событиях модуля убери скрипты из строчек
onPlayerDeath
onPlayerdying
OnPlayerRespawn

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

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

Добавлено в 01:45
У меня тут возникла интересная идея. Хочу сделать фит, позволяющий метать сразу несколько ножей или сюрикенов в одного противника за одну атаку. Честно говоря, даже представить не могу, как будет выглядеть скрипт для этого фита. Может, кто-нибудь другой может?
Chimeric
Проблема:


CODE
void main()
{

object oPC = GetLastUsedBy();

object oTarget = GetObjectByTag("hallwaysecretrope");

if (!GetIsPC(oPC)) return;

if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 13)
  {

     oTarget = GetWaypointByTag("shrine");

  lTarget = GetLocation(oTarget);

  if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;

  oTarget=GetFirstFactionMember(oPC, FALSE);

  while (GetIsObjectValid(oTarget))
     {
     AssignCommand(oTarget, ClearAllActions());

     AssignCommand(oTarget, ActionJumpToLocation(lTarget));
     oTarget=GetNextFactionMember(oPC, FALSE);
     }

  }
else
  {
  eEffect = EffectDamage(3, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);

  ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);

  oTarget = oPC;

  nInt = GetObjectType(oTarget);

  if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
  else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));

  eEffect = EffectDazed();

  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);

  AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
  AssignCommand(OBJECT_SELF, ActionWait(2.0));
  AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));

  DelayCommand(3.0, FloatingTextStringOnCreature("Ëåãêàÿ ÷åðåïíî-ìîçãîâàÿ òðàâìà (èëè åå ìûñëåííûé ýêâèâàëåíò)", oPC));

  }

}



Падаем и ударяемся, но только - VARIABLE DEFINED WITHOUT TYPE. Те же грабли, черт! Никак я не догоню. Подсобите, люди. И еще вот странное дело: если я в линии c DelayCommand заменю текст на другой - на одно слово из моего собственного другого скрипта, то компилятор не жалуется, а с этой фразой почему-то выдает UNKNOWN STATE IN COMPILER. Не в длине же дело, всего-то одно предложение. this.gif
AliceDiren
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 13)
{
  oTarget = GetWaypointByTag("shrine");
  location lTarget = GetLocation(oTarget); //!!! location
  if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
  oTarget=GetFirstFactionMember(oPC, FALSE);
  while (GetIsObjectValid(oTarget))
  {
    AssignCommand(oTarget, ClearAllActions());
    AssignCommand(oTarget, ActionJumpToLocation(lTarget));
    oTarget=GetNextFactionMember(oPC, FALSE);
  }}
else
  {
  effect eEffect = EffectDamage(3, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
  //!!! effect
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
  oTarget = oPC;
  int nInt = GetObjectType(oTarget);//!!! int
  if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
  else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
  eEffect = EffectDazed();
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
  AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
  AssignCommand(OBJECT_SELF, ActionWait(2.0));
  AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
  DelayCommand(3.0, FloatingTextStringOnCreature("...", oPC));
  }
}

ИМХО так.
dumbo
Chimeric
QUOTE (Chimeric @ Oct 9 2005, 23:26)
Как же все-таки заставить NPC бормотать фразы-линии?

http://www.wrg.ru/forums/index.php?showtop...875&#entry52274
чтоб не "бормотал", когда в локе нет игрока, поставить первой строкой в скрипте
Neverwinter Script Source
if (GetAILevel() == AI_LEVEL_VERY_LOW) return;
NedWarN
-fenix-
Не кричи ты, знаю я прикрасно как с if обращатся, я тока напутал ибо пиво. сорри. biggrin.gif
а вообще пасиба. yes.gif
Aiwan
dumbo, а что АI скидывается до минимума еслим РС нет в локе?
dumbo
Aiwan, насколько я помню(довольно давно и нетщательно тестировал это дело), именно так и есть. тонкостей регулирования движком уровня AI, правда, не расскажу... при установке "руками" уровня, движок перестает контроллировать его до тех пор, пока не поставишь обратно на AI_LEVEL_DEFAULT.
Lemegeton
QUOTE (Chimeric @ Oct 10 2005, 02:59)
Падаем и ударяемся, но только - VARIABLE DEFINED WITHOUT TYPE. Те же грабли, черт! Никак я не догоню. Подсобите, люди.

Все дело в том, что при первом упоминании переменной в скрипте нужно указывать ее тип.
Neverwinter Script Source
void main() {
object oPC = GetFirstPC();
// Обрати внимание на слово object. Здесь указывается, что переменная oPC
// содержит в себе объект (в данном случае, непосредственно первый игрок).
location lPC = getLocation(oPC);
// Обрати внимание на слово location. Здесь указывается, что переменная lPC
// содержит в себе координаты (в данном случае - первого игрока).

// В дальнейшем (в той же ф-ции!!!), указывать тип переменной не нужно.
oPC = GetPCSpeaker(); // Не нужно указывать, т.к. тип переменной указан выше.
...
}

Для избежания подобных ошибок, можно объявить все переменные ДО их использования. Следующий код полностью идентичен предыдущему:
Neverwinter Script Source
void main() {
// Сначала можно заняться объявлением переменных,
object oPC; 
location lPC;

// а уж потом работой с ними (с их значениями):
oPC = GetFirstPC();
lPC = GetLocation (oPC)
oPC = GetPCSpeaker();

...
}


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

Все то же самое касается и других типов переменных. Таких как string, int, vector...
QUOTE (Chimeric @ Oct 10 2005, 02:59)
И еще вот странное дело: если я в линии c DelayCommand заменю текст на другой - на одно слово из моего собственного другого скрипта, то компилятор не жалуется, а с этой фразой почему-то выдает UNKNOWN STATE IN COMPILER. Не в длине же дело, всего-то одно предложение.  this.gif
Только текст внутри двойных кавычек, или вообще всю строку? (Если можно, приведи текст).
Chimeric
1) Плюсую Лемегетона и Алису. Заработало вроде бы. Но только та же странность со словами продолжается: вот код.

CODE
void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 13)
{
 oTarget = GetWaypointByTag("shrine");
 location lTarget = GetLocation(oTarget);
 if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
 oTarget=GetFirstFactionMember(oPC, FALSE);
 while (GetIsObjectValid(oTarget))
 {
   AssignCommand(oTarget, ClearAllActions());
   AssignCommand(oTarget, ActionJumpToLocation(lTarget));
   oTarget=GetNextFactionMember(oPC, FALSE);
 }}
else
 {
 effect eEffect = EffectDamage(3, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
 ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
 oTarget = oPC;
 int nInt = GetObjectType(oTarget);
 if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
 else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
 eEffect = EffectDazed();
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
 AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
 AssignCommand(OBJECT_SELF, ActionWait(2.0));
 AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
 DelayCommand(3.0, FloatingTextStringOnCreature("1", oPC));
 }
}


Код работает, спасибо Алисе, и исправно выдает над головой число 1, которое я поставил просто так, для пробы. Но вот тот же самый код с другой фразой:

CODE
void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 13)
{
 oTarget = GetWaypointByTag("shrine");
 location lTarget = GetLocation(oTarget);
 if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
 oTarget=GetFirstFactionMember(oPC, FALSE);
 while (GetIsObjectValid(oTarget))
 {
   AssignCommand(oTarget, ClearAllActions());
   AssignCommand(oTarget, ActionJumpToLocation(lTarget));
   oTarget=GetNextFactionMember(oPC, FALSE);
 }}
else
 {
 effect eEffect = EffectDamage(3, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
 ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
 oTarget = oPC;
 int nInt = GetObjectType(oTarget);
 if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
 else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
 eEffect = EffectDazed();
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
 AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
 AssignCommand(OBJECT_SELF, ActionWait(2.0));
 AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
 DelayCommand(3.0, FloatingTextStringOnCreature("void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 13)
{
 oTarget = GetWaypointByTag("shrine");
 location lTarget = GetLocation(oTarget);
 if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
 oTarget=GetFirstFactionMember(oPC, FALSE);
 while (GetIsObjectValid(oTarget))
 {
   AssignCommand(oTarget, ClearAllActions());
   AssignCommand(oTarget, ActionJumpToLocation(lTarget));
   oTarget=GetNextFactionMember(oPC, FALSE);
 }}
else
 {
 effect eEffect = EffectDamage(3, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
 ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
 oTarget = oPC;
 int nInt = GetObjectType(oTarget);
 if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
 else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
 eEffect = EffectDazed();
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
 AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
 AssignCommand(OBJECT_SELF, ActionWait(2.0));
 AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
 DelayCommand(3.0, FloatingTextStringOnCreature("Ëåãêàÿ ÷åðåïíî-ìîçãîâàÿ òðàâìà (èëè åå ìûñëåííûé ýêâèâàëåíò)", oPC));
 }
}


Фраза про то, что вы, дескать, грохнулись и ушиблись. Ничего особенного. Однако не компилируется. unsure.gif

2) Мне тут дали маленький скриптик, так вроде бы не хватает функции main, но и с ней почему-то не складывается:

CODE
void EndGame(
   string sEndMovie
);


3) Какой командой можно заставить персонажа застонать? Кхмм, то есть крякнуть от боли?
AliceDiren
1.Chimeric, честно говоря я ничего не понимаю - попробовала самым простым способом, т.е. просто скопировала твой скрипт в тулсет и все работает dntknw.gif

2.
Neverwinter Script Source
void EndGame(string sEndMovie);

Это не скрипт, это декларация функции. Скрипт вот:
Neverwinter Script Source
void main()
{
string sEndMovie = "Игра окончена";
EndGame(sEndMovie);
}


3. Первое что приходит в голову - это
Neverwinter Script Source
object oPC = GetFirstPC();
AssignCommand(oPC, PlaySound("..."));

Добавлено в [mergetime]1128973644[/mergetime]
Я просто не знаю названия этого звука smile.gif
Tiger Greyhawk
QUOTE (Chimeric @ Oct 10 2005, 22:51)
Фраза про то, что вы, дескать, грохнулись и ушиблись. Ничего особенного. Однако не компилируется.

Там, наверное, есть какое-нибудь слово с буковой "я". Убери "я" или поставь патч dumbo.
Добавлено в [mergetime]1128984561[/mergetime]
З.Ы. Естественно, это не решение возможной проблемы по моему предположению, а проверка-подсказка нахождения проблемы. Решение (если действительно эта проблема) ищи в "Вопросы и Ответы" wink.gif

QUOTE
ОТВЕТ
Neverwinter Script Source
//================  Буква Я в стрингах (Автор Lex) ============================
string ya = GetName(GetWaypointByTag("YA")); // "+ya+" - так ее использовать
//================  Буква Я в стрингах (Автор Lex) ============================

DelayCommand(5.0, SpeakString("Да. Ключика у теб"+ya+" нет."));

Для работы этой схемы необходимо, чтобы в модуле был waypoint с tagом "YA" и именем "я"
--------------------------------------------------
в скриптах я делаю так:
- пишу сначала весь тест, какой должен быть в скрипте с буквами я.
- запускаю find and replace и меняю я на "+ya+"
Белатрис
Напишите скрипт плиз... что бы так - как только появляется игрок(ну в начале, я имею ввиду), появлялся диалог, как в "Орды Андердака"?
AliceDiren
Белатрис, делаешь невидимый объект с диалогом. Потом на OnEnter локи, при входе в которую тебе нужен диалог, вешаешь вот такой скрипт:
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if(!GetIsPC(oPC) && !GetIsDM(oPC))
  return;
location lLoc = GetLocation(oPC);
object oDialog = CreateObject(OBJECT_TYPE_PLACEABLE, "Таг твоего объекта", lLoc);
AssignCommand(oPC, ClearAllActions());//На всякий пожарный случай
AssignCommand(oDialog, ActionStartConversation(oPC));
}
Chimeric
Проклятье, как я ненавижу всю эту цифирь... Почему генератор так ограничен? angry2.gif Спасибо большое всем, особенно за совет насчет "я". Теперь компилируется, только я опять все спутал, когда добавлял функции. Вот скрипт:


CODE
void main()
{
string ya = GetName(GetWaypointByTag("ya"));
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 15)
{
 oTarget = GetWaypointByTag("shrine");
 location lTarget = GetLocation(oTarget);
 if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
 oTarget=GetFirstFactionMember(oPC, FALSE);
 while (GetIsObjectValid(oTarget))
 {
   AssignCommand(oTarget, ClearAllActions());
   AssignCommand(oTarget, ActionJumpToLocation(lTarget));
   oTarget=GetNextFactionMember(oPC, FALSE);
 }}
else
 {
 effect eEffect = EffectDamage(3, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL);
 ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
 oTarget = oPC;
 object oTarget;
oTarget = oPC;



 int nInt = GetObjectType(oTarget);
 if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), oTarget);
 else if (GetGender(oPC)==GENDER_MALE)
  {
  AssignCommand(oPC, PlaySound("vs_nbeggam2_hit2"));

  }
else
  {
  AssignCommand(oPC, PlaySound("vs_nbeggam2_hit2"));

  }

}

 ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
 AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_FAST));





oTarget = oPC;

int nInt = GetObjectType(oTarget);
nInt = GetObjectType(oTarget);
 AssignCommand(oPC, SetCameraFacing(30.0, 6.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP));
 eEffect = EffectDazed();
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
 eEffect = EffectKnockdown();
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 8.0f);
 AssignCommand(OBJECT_SELF, ActionWait(3.0));
 AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
 ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
 DelayCommand(3.0, FloatingTextStringOnCreature("Ëåãêà"+ya+" ÷åðåïíî-ìîçãîâà"+ya+" òðàâìà (èëè åå ìûñëåííûé ýêâèâàëåíò)", oPC));
 }


Должен при использовании предмета-веревки:

1) Проверять ловкость, если 15 или больше, то телепортировать в shrine.
2) Если меньше 14, то падаем навзничь на 8 секунд, ошеломление на 30 секунд, урон ударного типа 3 очка, быстрое затемнение на 3 секунды - для всех; кроме того, если мужчина, то такой-то звук, если женщина, то другой (сейчас одинаковые, потом впишу); дальше для всех просветление средней скорости, эффект сотрясения экрана, появляется надпись над головой.
3) Кроме того, нужно куда-то в середину (после затемнения, но до просветления) воткнуть телепортацию в пункт ropefall без визуального эффекта. Это в той же зоне. (Там в прыжке рушишься с веревки, так что имеет смысл оказаться чуть в стороне.)

Как видите, получилась какая-то тарабарщина. ph34r.gif

P.S. Взялся просматривать сообщение перед отправкой и увидел, что Алиса уже ответила. Снова спасибо. Глянь на этот, более сложный вариант, ладно?
Белатрис
AliceDiren, тэг объекта - lLoc?
AliceDiren
Chimeric, вроде работает:
Neverwinter Script Source
void main()
{
string ya = GetName(GetWaypointByTag("ya"));
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");

if (!GetIsPC(oPC))
return;

if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 15)
{oTarget = GetWaypointByTag("shrine");
location lTarget = GetLocation(oTarget);
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID)
  return;

oTarget=GetFirstFactionMember(oPC, FALSE);
while (GetIsObjectValid(oTarget))
  {AssignCommand(oTarget, ClearAllActions());
  AssignCommand(oTarget, ActionJumpToLocation(lTarget));
  oTarget=GetNextFactionMember(oPC, FALSE);}
}
else
{effect eEffect = EffectDamage(3, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);
  eEffect = EffectDazed();
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 30.0f);
  eEffect = EffectKnockdown();
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 8.0f);
  ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC));

  FadeToBlack(oPC, FADE_SPEED_FAST);
  AssignCommand(oPC, JumpToObject(GetWaypointByTag("ropefall")));
  AssignCommand(oPC, SetCameraFacing(30.0, 6.0, 40.0, CAMERA_TRANSITION_TYPE_SNAP));
  DelayCommand(3.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));

  if (GetGender(oPC)==GENDER_MALE)
  AssignCommand(oPC, PlaySound("vs_nbeggam2_hit2"));
  else
  AssignCommand(oPC, PlaySound("vs_nbeggam2_hit2"));

DelayCommand(3.0, FloatingTextStringOnCreature("...", oPC));
}
}

Добавлено в [mergetime]1129005621[/mergetime]
Белатрис, нет таг невидимого объекта smile.gif
Tiger Greyhawk
Chimeric
Основное, что мне бросилось в глаза: ты задаешь
Neverwinter Script Source
object oTarget = GetObjectByTag("hallwaysecretrope");
...
object oTarget;

QUOTE (Lemegeton @ Oct 10 2005, 18:59)
Обрати внимание, что тип переменных должен задаваться один и только один раз в области действия переменной (внутри функции, в основном).

Да и вообще как-то с oTarget получается сильно завернуто. crazy.gif В самом начале - один объект, через пару строчек уже другой. При том, что первый объект нигде не применялся:
Neverwinter Script Source
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 15)
{
oTarget = GetWaypointByTag("shrine");
Но весь код не еще успел посмотреть sad.gif

PS плз, пользуйся кнопкой NSS, а не Код для скриптов.

+ утебя нигде не задан тип переменной: eEffect = EffectDazed();
т.е. effect eEffect = EffectDazed(); - должно быть.
+ называй лучше переменные осмысленно. А то у тебя счас все переменные типа effect названы eEffect переменные типа Int - iInt и т.п. Оно, конечно, может работать нормально, но запутаться проще простого. Ты же меняешь в процессе значение переменной:
oTarget = GetWaypointByTag("shrine");
oTarget=GetFirstFactionMember(oPC, FALSE);
oTarget=GetNextFactionMember(oPC, FALSE);
oTarget = oPC;
и т.д. каждый раз соответственно скрипт ссылается на НОВОЕ (последнее) значение. Не спорю, может и нужное на текущий момент.
Белатрис
AliceDiren, делал делал, так нифига не наделал. Пожалуйсто объясни каждый шаг. Например: Нажми туда, сделай это, поставь такой то таг...
Aiwan
Chimeric пользуйся NSS кнопкой а не КОД
CODE

void main()
{
string ya = GetName(GetWaypointByTag("ya"));
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 15)

Neverwinter Script Source
void main()
{
string ya = GetName(GetWaypointByTag("ya"));
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("hallwaysecretrope");
if (!GetIsPC(oPC)) return;
if (GetAbilityScore(oPC, ABILITY_DEXTERITY)>= 15)
Chimeric
Сейчас, Алиса, я буду торжественно тестировать твою версию кода. Я умащу своё тело благовонными маслами, я вознесу молитвы четырем углам земли, я заколю барашка с белоснежным руном. Если все заработает, персонаж упадет на попа как ему положено и застонет по половому признаку, то я проведу завтра десять минут в глубокой медитации, направляя в твою сторону отборные положительные флюиды. wizard.gif

Вообще всем спасибо. Я так не напирал бы со скриптами (ишь сколько вывалил), если бы не конкурс квестов. У меня и так будет маленький, зато атмосферный. В начале я хотел что-то минималистское в духе Марселя Марсо. Одна комната без звука и музыки, три истукана, беседуешь с ними поочередно. Потом понял, что заскучаю сам, прежде чем сделаю, и вот взялся взамен за этот проект. Уже сделал бы, но так надолго застреваю на скриптах, что боюсь вообще не успеть. wacko.gif

Учитывая спешку, помогите, пожалуйста, еще вот с этим. Вопрос все тот же: нужно, чтобы NPC говорили линии с интервалом в несколько секунд, и закольцевать все это дело, чтобы крутилось. Вот предложенный Айваном вариант:

Neverwinter Script Source
object oUbo = GetObjectByTag("AM_CUT2_UBO");
    object oHalib = GetObjectByTag("AM_CUT2_HAL");

    DelayCommand(17.0, AssignCommand(oHal, SpeakString("Фраза #1.")));
    DelayCommand(18.5, AssignCommand(oUbo, SpeakString("Фраза #2.")));
    DelayCommand(20.0, AssignCommand(oHal, SpeakString("Фраза #3")));
    DelayCommand(22.0, AssignCommand(oHal, SpeakString("Фраза #4.")));


Но тут, кажется, для двух людей сразу, и потом я опять собьюсь с толку, вставляя все это и компилируя. (Плюс в том, что я с вашей помощью собираю базу скриптов, так что на будущее у меня есть заготовки для типовых действий.) К тому же это, кажется, скрипт не личный, а для OnEnter. В принципе это все равно, а вот то, что не закольцовано, это хуже. Так что нужно? Ситуация такая: в одной комнате стоят несколько NPC и бормочут. Они разговаривают не друг с другом, а просто так. Бормотать они должны, завидев персонажа, с интервалом в 10 секунд или около того. Заодно в тот же скрипт желательно вставить неподвижность NPC, чтобы не шевелились, не поворачивались и вообще реагировали самым минимальным образом. Я пробовал CutsceneParalyze, но не пошло.

P.S. Скажите, а можно как-нибудь сделать NPC полупрозрачным?

P.P.S. Зависит ли способность говорить у NPC от AppearanceType? Я поставил одно существо, внешне монструозное, но вообще-то в ним можно нормально потолковать. Отключил агрессивность и поменял подходящие параметры, но вот уже который набор голосовых реплик для него тасую, а он так и не говорит "привет". И если нападаешь на него - дерется, а молчит. Я вроде бы уже и полные наборы беру, где есть звуки для приветствий, ну а "Я тебя закопаю!" и т.п. и вовсе присутствуют в каждом. Непонятно.
Lemegeton
QUOTE (Chimeric @ Oct 11 2005, 09:36)
P.S. Скажите, а можно как-нибудь сделать NPC полупрозрачным?

Пихай в OnSpawn крича:
Neverwinter Script Source
object oPC = OBJECT_SELF; // Либо как-нибудь по-другому pardon.gif
// Создаем экстраординарный эффект (его нельзя расколдовать)
effect eGhost = ExtraordinaryEffect(EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE));
// Можно попробовать другие константы:
// VFX_DUR_GHOSTLY_PULSE
// VFX_DUR_GHOST_TRANSPARENT

// Накладываем эффект навсегда
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPC, 0.0f);


Вопрос о том, как снять этот эффект будет? spiteful.gif

QUOTE (Chimeric @ Oct 11 2005, 09:36)
P.P.S. Зависит ли способность говорить у NPC от AppearanceType? Я поставил одно существо, внешне монструозное, но вообще-то в ним можно нормально потолковать. Отключил агрессивность и поменял подходящие параметры, но вот уже который набор голосовых реплик для него тасую, а он так и не говорит "привет". И если нападаешь на него - дерется, а молчит. Я вроде бы уже и полные наборы беру, где есть звуки для приветствий, ну а "Я тебя закопаю!" и т.п. и вовсе присутствуют в каждом. Непонятно.

Все, что делает непись прописано в его onheartbeat и onperceprion событиях. Если их убрать, это будет пугало огородное.

QUOTE (Chimeric @ Oct 11 2005, 09:36)
Учитывая спешку, помогите, пожалуйста, еще вот с этим. Вопрос все тот же: нужно, чтобы NPC говорили линии с интервалом в несколько секунд, и закольцевать все это дело, чтобы крутилось. Вот предложенный Айваном вариант:

Зачит так. Все эффекты на объектах происходят (или не происходят) раз в шесть секунд. Соответственно, можно в userdefined событии сделать что-то вроде:
Neverwinter Script Source
void main()
{
    int nEvent = GetUserDefinedEventNumber();
    if (nEvent == 1002) //  Проверяем на OnPerception
    {
      // Проверка на видимость.
      if (GetLastPerceptionSeen()) // Если увидел,
        GetLocalInt(OBJECT_SELF, "Whisper", 1) // говорить.
      else if (GetLastPerceptionVanished()) // Если исчез
        GetLocalInt(OBJECT_SELF, "Whisper", 0) // молчать.
    } else
    if (nEvent == 1001) // Проверяем на Heartbeat
    {
        if (GetLocalInt(OBJECT_SELF, "Whisper") // Проверяем лок. переменную
          {
            int iSpk = GetLocalInt(OBJECT_SELF, "sturn");
            switch (iSpk) {
            case 0:
                SpeakString("О, горе мне!");
                break;
            case 1:
                SpeakString("Позор на мои седины...");
                break;
            case 2:
                SpeakString("Бедный я, бедный...");
                break;
            case 3:
                SpeakString("Я проклят всеми...");
                break;
            default:
                // Если не попадает в одно из условий, обнуляем. pardon.gif
                iSpk = -1;
                // Ставим равным -1, поскольку после switch'а увеличим на 1
                break;
            };
            SetLocalInt(OBJECT_SELF, "sturn", iSpk+1);
          }
    }
}

Этот скрипт требует стандартных неписевых OnHeartbeat и OnPerception событий.
Если надо реже говорить, можно вставить пустые case. wink.gif

Если не нужны стандартые OnHeartbeat и OnPerception, можно сделать два скрипта. Тогда пропадет почти весь стандартный AI, и непись превратится в истукана, периодически что-то бормочущего. Ни поговорить сним, ни подраться...

Можно еще глобальнее подойти к этому делу. pardon.gif
Chimeric
Не компилируется, Лем. Пишет, что недостает точки с запятой на линии после первого Whisper. Добавляю - продолжает писать то же самое. К тому же с какой-то радости отказывается признавать еще и букву "р". Черт, не успеваю... swoon.gif

Neverwinter Script Source
void main()
{
    string ya = GetName(GetWaypointByTag("ya"));
    string Yac = GetName(GetWaypointByTag("yac"));
    int nEvent = GetUserDefinedEventNumber();
    if (nEvent == 1002)
    {

      if (GetLastPerceptionSeen())
        GetLocalInt(OBJECT_SELF, "Whisper", 1)
      else if (GetLastPerceptionVanished())
        GetLocalInt(OBJECT_SELF, "Whisper", 0)
    } else
    if (nEvent == 1001)
    {
        if (GetLocalInt(OBJECT_SELF, "Whisper")
          {
            int iSpk = GetLocalInt(OBJECT_SELF, "chloe");
            switch (iSpk) {
            case 0:
                SpeakString("Ia?caaao! Ii i?aaii?ae iieo?eou ii? a nieio, ?ai iioaeiaaou iai"+ya+".");
                break;
            case 1:
                SpeakString("Noieuei eao aie?oa aa ieiei.");
                break;
            case 2:
                SpeakString("Eaeeenoa aii"+ya+"ea ian iaieo aac eiioa ca i?iaoeoaie ia Iiaue ?uiie, eae au iie n Iieee?aoii oi?aaeeenu a eaaea aac ian?");
                break;
            case 3:
                SpeakString("Aio i?eoiaeeinu ?eoaou o?uaeaie.");
                break;
            case 4:
                SpeakString("+yac+" ana-oaee aiaeeanu io iaai eieuoa e ee"+ya+"oau a O?aia E?ieee. Eae ?ac ca o?e ai"+ya+" ai yoiai o?ana.");
                break;
            case 5:
                SpeakString("+yac+" neacaea aio, ?oi oi?o nia?aea iaeu?eea, a iioii aaai?eo.");
                break;



            default:

                iSpk = -1;

                break;
            };
            SetLocalInt(OBJECT_SELF, "chloe", iSpk+1);
          }
    }
}


P.S. Рано мне отсылать Алисе флюиды. Ее вариант скрипта работает только наполовину, эффекты вообще не применяются, к тому же прежде всего должно начинаться затемнение. Сейчас буду все править.

Так, разобрался, почему "р" не признает. Это потому, что в Ворде редактировал, а надо бы в Блокноте. rolleyes.gif Ворд еще и кавычки какие-то не те ставит. Тем не менее, проблема с точкой с запятой остается.

Не разобрался зато с веревочным скриптом. Не работает алисин скрипт, то есть эффекты не запускает. sad.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.