Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Dik Morris
Да подойдет под любой smile.gif
Ставь желательно нивидемый обьект, скриптик на OnHeartbeat и вперед.
PS: феникс ведь все расписал...
SeDAl
и можно подробнее рассказать об этом:
QUOTE
//это вейпы. они обозначают место, на котором создаются плейсы ночью
object oWP_1 = GetWaypointByTag("ТАГ первого");
object oWP_2 = GetWaypointByTag("ТАГ второго");
object oWP_3 = GetWaypointByTag("ТАГ третьего");


И что такое "ResRes_плейса1"?
Dik Morris
Neverwinter Script Source
//это вейпы. они обозначают место, на котором создаются плейсы ночью
object oWP_1 = GetWaypointByTag("ТАГ первого");
object oWP_2 = GetWaypointByTag("ТАГ второго");
object oWP_3 = GetWaypointByTag("ТАГ третьего");

Вейпы:
Вайпоинты. (Точки маршрута, в русс. версии)
В данном скрипте, они определяют место где создадутся нужные тебе плейсы. Т.е на том месте где ночью должны быть плейсы, поставь вайпоинты. (плейсы не размещай)
PS: старайся редактировать старые сообщения, ведь форум не резиновый. pardon.gif
Так же советую прочитать различные мануалы (раздел файлы) + на форуме огромное кол-во статей в помощь новичкам. wink.gif
********************************
QUOTE
И что такое "ResRes_плейса1"?

Не: ResRes, а ResRef.
Служебное имя, уникальное для каждого предмета.
Присваивается когда имя создания/плейса/итема/и т.п пишется англ. буквами
********************************
Например:
Neverwinter Script Source
void main()
{
CreateItemOnObject("nw_it_gem012", GetPCSpeaker(), 1);
//Выдаем предмет по ResRes.
}
SeDAl
Значит я не ставлю сам плейсейбл на локацию. Ставлю вейпоинт в то место, где должен появляться плейсейбл.
в строке
QUOTE
object oObject_1 = GetObjectByTag("ТАГ первого");

пишу тег плейсейбла
QUOTE
object oWP_1 = GetWaypointByTag("ТАГ первого");

пишу тег вейпоинта
QUOTE
CreateObject(OBJECT_TYPE_PLACEABLE, "ResRes_Плейса1", GetLocation(oWP_1));

ResRef плейса
Так все? У меня не работает что-то.
Так ResRes и ResRef - это одно и тоже? В скрипт нельзя писать ResRef заместо ResRes?
И еще могут быть имена, теги и РесРефи одинаковыми?
Aiwan
SeDAl я тебе даю скрипт, он делает вот что: есть невидимый объект. У него в слоте (любом) стоит эот скрипт. Любом я конечно пошутил, но я имею ввиду нужном тебе. У меня он стоит на OnUserDefaine. Можно хоть на хертбит, главное НАСТРОЙ УСЛОВИЕ КОГДА ОН СРАБОТАЕТ. Его суть. На этом невидимом объекте вешаем локальные стринги ResRef_PLC_1, ResRef_PLC_2 и т.д. равные ResRef-у объектов что должны создаться. Сам скрипт определит сколько их и создаст каждый раз уникальный из общего числа. Дальше. Если тебе нужно строгое положение, то предварительно поставь объект на локацию. Если тебе нужно разное расположение то тут, то дальше присвой на него "RandomLocation" LocalFloat равную метрам твоего круга. Ну присвоил ты 10, значит на 10 метрах по огружности он будет создаваться каждый раз. Дальше, если ничего не установить, то создаваться будет прямо на месте этого невидимого объекта. Скрипт рабочий, заточи под себя.
Таги. Невидимый объект - это общий таг группы. А все объекты создадутся в таком виде "AM_PLC_SP_"+ТАГ НЕВИДИМОГО ОБЪЕКТА. Соответсвенно, если тебе нужено строгое положение всех спавнящих плейсов, то поставь один такой в любом углу поверни как надо и все следующие пудут на нем спавниться. Зачем такие сложности? Вот у меня есть плейсы кристаллов на стенах. Их поймать трудно куда спавняться, а так я поставил его один раз и забыл. Каждый раз вхожу как бы в новую локацию, кристаллы меняются на стенах и полу. Так же и НПС. Но это уже совсем другой скрипт и настройки...

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnUserDefaine  am_cud_spawn
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    СКРИПТ НЕПОСРЕДСТВЕННО ИСПОЛНЯЕТ ОБМЕН PLC_
    ОБЪЕКТОВ В ЛОКАЦИЯХ В СЛУЧАЕ РАЗРУШЕНИЯ И
    В СЛУЧАЕ ВХОДА РС В ЛОКАЦИЮ ПО СИГНАЛУ

  Скрипт спавнящий разных PLC объекты на локациях.
  AM_PLC_SP_[+ТАГ OBJECT_SELF] - наши объекты.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 28.11.2005
//:://///////////////////////////////////////////
location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE)
{
if(!bOnLine)
fRadius=IntToFloat(Random(FloatToInt(fRadius)));

float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget)));
float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget)));
float fRndomAngle=IntToFloat(Random(360));
location lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0);
return lNEW;
}

void Debug(string message)
{
    object oPC = GetFirstPC();
    if (!GetLocalInt(GetModule(), "DEBAG_PC"))
    {
      SendMessageToPC(oPC, "Debag message: "+message);
    }
    if (!GetLocalInt(GetModule(), "DEBAG_DM"))
          {
            SendMessageToAllDMs("Debag message to DMs: "+message);
          }
}

void main()
{

  int nEvent = GetUserDefinedEventNumber();
  if (GetLocalInt(OBJECT_SELF, "STOP")) return; // Отключаем, если надо
  if (GetLocalInt(OBJECT_SELF, "DAYS_WAITING")>0) return;
//======================== USER DEFINED EVENT===================================
    if (nEvent == 7000)
  // nEvent == 7000 - сигнализируем скриптом. У меня так, у тебя может быть другое
    {
    if (GetLocalInt(OBJECT_SELF, "STOP"))
      return;

      object oSelf = OBJECT_SELF;
      string sTag = GetTag(oSelf); // Таг невидимого объекта (Общий таг группы)
      object oPlc = GetNearestObjectByTag("AM_PLC_SP_"+sTag);
      int i=1;
      string sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
      object oNext; // Следующий объект на это место
      location lLoc; // Место где появляется наш объект

    // Задержка для стандартных объектов, зависит от имени OBJECT_SELF
    if(GetName(oSelf)=="Spawn PLC System")
      SetLocalInt(oNext, "DAYS_WAITING", Random(5)+1);

      float f = GetLocalFloat(oSelf, "RandomLocation");
      if(f!=0.0)lLoc = CreateRandomLocation(oSelf, f);
      // Если установить на скрытый объект LocalFloat == "RandomLocation"
      // то ее значение будет радиусом на которм будет пояляться объект.
      // Если поставить один объект в точку, то все следующие будут
      // появляться на его месте. Если не ставить НИЧЕГО, то все объекты
      // будут создаваться на этом невидимом объекте.

      if(f==0.0)
      {
            if(!GetLocalInt(oSelf, "DO_THIS"))
            {
              if(oPlc != OBJECT_INVALID)
              {
                SetLocalLocation(oSelf, "SPAWN", GetLocation(oPlc));
              }
              else
                  {
                    SetLocalLocation(oSelf, "SPAWN", GetLocation(oSelf));
                  }
              SetLocalInt(oSelf, "DO_THIS", TRUE);
            }
          lLoc = GetLocalLocation(oSelf, "SPAWN");
        }

      while(sResRef!="")
      {
        i++;
        sResRef=GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
      }
      // Так, как вверху, условие было для первого пустого значения
      // то один порядковый номер мы отнимаем из результата
      i = i-1;
      Debug("Общее число объектов - "+IntToString(i));
      int iNext = Random(i)+1;
      sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext));
      Debug("Следующий - "+IntToString(iNext));

      //----------------------------------------------------------------------
      //  Если выпал тот же ResRef, что стоит здесь
      //----------------------------------------------------------------------
        if(sResRef == GetResRef(oPlc))
        {
            Debug(IntToString(iNext)+" - этому PLC выпало опять быть здесь.");
            iNext++; // Увеличиваем его номер на еденицу
            if(iNext > i) iNext = 1;
            // Если номер больше общего кол-ва PLC, то начинаем с первого.
            Debug(IntToString(iNext)+" - сменим номер на еденицу больше.");
        }
        oNext = CreateObject(OBJECT_TYPE_PLACEABLE, GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext)), lLoc,0, "AM_PLC_SP_"+sTag);
        DestroyObject(oPlc);
    }
//------------------------------------------------------------------------------
}
Sayran
Всем привет,народ подскажите пожалуйсто как реализовать в скриптах респаун мобов,хочу сделать чтото типа линки,но в скриптах пока плохо разбираюсь,буду очень благодарен за помощь !!!
-fenix-
Sayran, смотря какой!
Можно с помощью энкаунтера(случайной встречи) - это при наступлении игрока на определенную область, тогда можно вообще без скриптов обойтись.

Еще посмотри в Базе скриптов - тема такая в этом форуме, там есть несколько скриптов про респаун.

QUOTE (Sayran @ Dec 27 2005, 16:53)
чтото типа линки

Эм, а поподробнее, что конкретно нужно?

QUOTE (SeDAl @ Dec 26 2005, 19:20)
Так ResRes и ResRef - это одно и тоже? В скрипт нельзя писать ResRef заместо ResRes?

Есть ТОЛЬКО ResRef , а ResRes - это опечатка!

SeDAl, скачай туториал Айвана с сайта, там очень много полезного!
Sayran
Со встречами случайными я разобрался,это просто,мне нужен такой скрипт,что б например герой появился на карте убил моба,а он допустим через минуту респаунился,на этой же карте в этом же месте,неполучаится ничего и все тут.....
Lex
QUOTE (Sayran @ Dec 27 2005, 17:27)
неполучаится ничего и все тут.....

а как, позволь спросить, ты делаешь, что у тебя не получается?
-fenix-
QUOTE (Sayran @ Dec 27 2005, 18:27)
Со встречами случайными я разобрался,это просто,мне нужен такой скрипт,что б например герой появился на карте убил моба,а он допустим через минуту респаунился,на этой же карте в этом же месте,неполучаится ничего и все тут.....


Вот простенький на слот OnDeath моба.
Neverwinter Script Source
//это мы написали функцию, чтобы можно было CreateObject использовать в функции DelayCommand
void ActionCreateObject(int iIbjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="");



void ActionCreateObject(int iIbjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{
CreateObject(iIbjectType, sTemplate, lLocation, bUseAppearAnimation, sNewTag);
}

//это само действие
void main()
{
location lLoc = GetLocation(OBJECT_SELF);//место, где умер моб
string sString = "deer002";//тут указываешь его РесРеф в палитре

//создаем его на месте смерти. 3.0 - это время, через которое создастся моб
DelayCommand(3.0, ActionCreateObject(OBJECT_TYPE_CREATURE, sString, lLoc));
}


Обязательно посмотри в Базе скриптов.

QUOTE (Lex @ Dec 27 2005, 19:32)
1. ты даешь тело функции над void main() так что описание функции не нужно.


yes.gif , но за то при нажатии на ActionCreateObject в списке функций будет памятка
QUOTE
//это мы написали функцию, чтобы можно было CreateObject использовать в функции DelayCommand

smile.gif

QUOTE (Lex @ Dec 27 2005, 19:32)
2. ты сам проверял? Если труп исчезает, то твой DelayCommand пропадет вместе с ним.

Пардон, запарил. blush.gif
Lex
1. ты даешь тело функции над void main() так что описание функции не нужно.
те это:
QUOTE (-fenix- @ Dec 27 2005, 18:21)
//это мы написали функцию, чтобы можно было CreateObject использовать в функции DelayCommand
void ActionCreateObject(int iIbjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="");

лишнее.

2. ты сам проверял? Если труп исчезает, то твой DelayCommand пропадет вместе с ним. При задержке 3 сек может еще успеешь.. но при большей, чем 5 - нет. (в случае стандартной настройки с исчезновением тел. Но в любом случае это не надежно). Вешай эту вещь на что-нить.. например на локацию.

3.Sayran, посмотри в разделе Шарды (я так понял, ты всетаки не сингл делаешь, ибо спавн монстров какой-то специфически-шардовый у тя) что-нить по Спавн-Системам. Там было. Скриптить ничего не надо, тока разобраться и настроив, поставить.
Sayran
Огромное спасибо ЗА ПОМОЩЬ !!! МАСТЕРАМ !!! ВЫРУЧЕЛИ !!! biggrin.gif
justshurik
Ситуация такая.Есть два обьекта : рычаг и баллиста. Баллиста нацелена на определенную точку.
Нужно чтобы при нажатии на рычаг баллиста выстреливала (к примеру фаерболом). Если кому не сложно, подскажите, как сделать. Заранее благодарен!
NedWarN
justshurik
Поставь скрипт на ОнЮзет Рычага!
Всем Сорри >> нет Возможности Использовать NSS!
void main()
{
object oPC = GetLastUsedBy();
object oBallista = GetObjectByTag("BALLISTA");
object oCel = GetObjectByTag("CEL");
int nSpell = SPELL_FIREBALL;
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
AssignCommand(oBallista, DelayCommand(0.6, ActionCastFakeSpellAtObject(nSpell,oCel, PROJECTILE_PATH_TYPE_DEFAULT)));
}
Добавлено в [mergetime]1136172081[/mergetime]
А вообще Зачем Тема Вопросы Новичков, или Скрипты. Создана? biggrin.gif
Пость такие вопросы Там!
Dik Morris
Есть множество тем где можно было задать вопрос, повнимательнее в следующий раз:
Одиночный вопрос
Скрипты
Вопросы новичков
Дополнение к скрипту NedWarN’ а.
Neverwinter Script Source
void main()
// Cкрипт на onUsed рычага.
{
object oPC = GetLastUsedBy();//Определяем игрока, в данном случаее ето тот кто юзает обьект.
object oBa = OBJECT_SELF;//Так все упрощается.
object oCel = GetObjectByTag("CEL");//Объект на который должен быть скастован спелл.
int nSpell = SPELL_FIREBALL;//Определяем переменную скастованного спелла, сейчас это фаербол
//Но может быть и другой (набери в фильтре констант: SPELL_*)

if (((GetIsObjectValid(oCel))
&& GetDistanceToObject(oCel)<=40.0f)
&&  GetLocalInt(OBJECT_SELF,"BALL")==!1)
//Длинная проверка. Если обьект "живой" и находится на дистанции больше или равной 40, а так же проверка на локалку (сейчас поймешь зачем)
  {
  AssignCommand(oBa, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));//Активируем плейс
  AssignCommand(oBa, DelayCommand(0.6, ActionCastFakeSpellAtObject(nSpell,oCel, PROJECTILE_PATH_TYPE_DEFAULT)));//Запускаем снаряд. НО! Снаряд "пустышка", вреда не наносит, если нужен боевой снаряд то замени фун=цию на: ActionCastSpellAtObject
  SetLocalInt(OBJECT_SELF,"BALL",1);//Уст. локальную переменную для эффекта перезарядки баллисты.
  DelayCommand(5.0, SetLocalInt(OBJECT_SELF,"BALL",0));//Снимаем локалку, типа перезарядилась
  DelayCommand(5.3, AssignCommand(oBa, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE)));
  }
else if(GetLocalInt(OBJECT_SELF,"BALL")==1)//Думаю по спиакам понятно.
  {
  FloatingTextStringOnCreature("Баллиста перезаряжается...",oPC);
  }
else if(!GetIsObjectValid(oCel))//Думаю по спиакам понятно.
  {
  FloatingTextStringOnCreature("Обьект уничтожен...",oPC);
  }
else if(GetDistanceToObject(oCel)>40.0f)//Думаю по спиакам понятно.
  {
  FloatingTextStringOnCreature("Обьект слишком далеко!",oPC);
  }
}
justshurik
Подскажите пожалуйста. Вот есть некая зона (тригер генерации новый общий). Нужно чтобы когда какой-нибудь обьект входит в нее у него можно было взять тег и использовать этот обьект в качестве мишени для баллисты (см мой предыдущий пост). Причем неизвестно точно какой обьект войдет на эту зону(сам игрок или какой-нибудь монстр) И кроме того, скрипт должен сравнивать по тегу, нужно ли стрелять баллисте в заданный обьект или нет. Т.е. работа скрипта выглядит примерно так: некий обьект вошел в некую зону триггера, находящаяся неподалеку балииста проверяет(по тегам прописаным в скрипте, не по фракции) является ли этот обьект дружественным и соответственно стреляет или не стреляет. Если кто знает как это сделать, расскажите пожалуйста. Заранее спасибо!
Dik Morris
Ставь на onEnter триггера.
Neverwinter Script Source
void main()
{
object oEnter = GetEnteringObject();//Тот кто наступил на триггер.
object oBall  = GetNearestObjectByTag("BALLISTA");//Таг ближайшей баллисты.
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);//Игрок

if ((GetTag(oEnter)=="TAG_ENTER") || GetIsPC(oPC))
/*
Проверка на таг, если таг вошедшего равен: TAG_ENTER или вошедший игрок, ТО:
(Можешь добавить проверку на другие таги, в этом помогут операторы && - И, || - или)
*/

  {
  AssignCommand(oBall, ActionCastSpellAtObject(SPELL_FIREBALL,oEnter,PROJECTILE_PATH_TYPE_DEFAULT));
  //Кастуем фаерболл.
  }
}
justshurik
Большое спасибо! Еще маленький вопросик. Можно ли сделать так, что бы баллиста кастовала фаерболл все время, пока игрок или кто-либо еще находиться на триггере?
Добавлено в [mergetime]1136224171[/mergetime]
Только с разницей между выстрелами в 1 секунду
Lex
QUOTE (Dik Morris @ Jan 2 2006, 09:50)
AssignCommand(oBa, DelayCommand(0.6, ActionCastFakeSpellAtObject(nSpell,oCel, PROJECTILE_PATH_TYPE_DEFAULT)));//

не PROJECTILE_PATH_TYPE_DEFAULT а PROJECTILE_PATH_TYPE_BALLISTIC.
QUOTE (NedWarN @ Jan 2 2006, 06:19)
Всем Сорри >> нет Возможности Использовать NSS!

а это что за бред??? Тэги ручками написать никак, если у тебя яваскрипты не пашут и кнопки не отрабатывают???? пред.
justshurik
QUOTE (Lex @ Jan 2 2006, 23:49)
не PROJECTILE_PATH_TYPE_DEFAULT а PROJECTILE_PATH_TYPE_BALLISTIC.


И с DEFAULT и с BALLISTIC нормально работает

Обьясните пожалуйста, что значит сообщение: СКРИПТ ххххх, СЛИШКОМ МНОГО ИНСТРУКЦИЙ.
Lex
QUOTE (justshurik @ Jan 3 2006, 00:39)
И с DEFAULT и с BALLISTIC нормально работает

разница в визуализации. Дефолт это полет по прямой. Балистик - по баллистической траектории. Не критично, но смотрится красиво.
QUOTE (justshurik @ Jan 3 2006, 00:39)
Обьясните пожалуйста, что значит сообщение: СКРИПТ ххххх, СЛИШКОМ МНОГО ИНСТРУКЦИЙ.

то и значит. Скрипт запрашивает выполнение слишком большого количества операций. Скорее всего бесконечный цикл там внутри оказался.
justshurik
Да. Там был бесконечный цикл. Эт я пытался сделать выстрелы баллисты с интервалом в 1 секунду. Так и не получилось.
Lex
чтобы палить постоянно с интервалом в 1 секунду (кстати многовато выстрелов больно получается). То надо в ХБ записать 6 выстрелов в задержкой в 0,1,2,3,4,5 секунд.
justshurik
Спасибо за ответ. Только я не совсем понял, что такое ХБ?
Dik Morris
Neverwinter Script Source
//Скрипт на onHeartBeat баллисты.
//Баллиста будет палит по игроку или НПС каждые шесть секунд, вплоть до смерти, //мишени.
void main()
{
object oBal = OBJECT_SELF;//Сама баллиста
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);//Игрок
object oNPC = GetNearestObjectByTag("");//НПС (выше ты писал что нужна проверка по тагу)

if ((GetIsObjectValid(oPC)) && GetDistanceToObject(oBal)<=30.0f)
//Приверка, если игрок жив и находится на дистанции 30 метров то:
  {
  AssignCommand(oBal, ActionCastSpellAtObject(SPELL_FIREBALL,oPC,PROJECTILE_PATH_TYPE_DEFAULT));
  //Шарахнем фаербольчиком : D
  }
else if ((GetIsObjectValid(oNPC)) && GetDistanceToObject(oBal)<=30.0f)
/*
А если жив нпс то:
(можно легко добавить еще проверку на НПС, юзая операторы || (или) выглядеть будет примерно такsmile.gif
else if ((GetIsObjectValid(oNPC)) || GetIsObjectValid(GetNearestObjectByTag("ТАГ ВТОРОГО НЕПИСЯ")))
*/

  {
  AssignCommand(oBal, ActionCastSpellAtObject(SPELL_FIREBALL,oPC,PROJECTILE_PATH_TYPE_DEFAULT));
  //Шарахнем фаербольчиком : D
  }
}

PS:
QUOTE
Спасибо за ответ. Только я не совсем понял, что такое ХБ?

Эвент onHeartBeat, кратко просто ХБ.
(Служит для того чтобы нужное событие происходило каждые 6 секунд.)
Aiwan
QUOTE (justshurik @ Jan 3 2006, 17:53)
Спасибо за ответ. Только я не совсем понял, что такое ХБ?

Учите, батенька, матчасть! big_boss.gif Без этого вы ничего не поймете даже если вам дадут все готовое. yes.gif
Nashman
Привет,
По требованию Aiwan(а), я вопросик разместил сюда, чуть-чуть его изменив:
Суть:
Есть у меня старуха(НПС), есть пирог(o_pie001), есть ВейПойнт(Вейп).
Цель:
- Разговариваем из старухой, когда переходим к определенной реплике, то она идет к столу(ВейПойнту), и:
Вариант 1:
Проигрывается анимация, возле стола, и старуха как будто бы ставит на стол пирог(o_pie001), на самом деле перед этим, пирог нужно сделать невидимым, а потом когда проиграет анимация – видимым.
Вариант 2:
Вместо невидимого пирога, просто создать свой пирог из тегом o_pie001.
Вариант 3:
Просто из инвентаря старухи передать пирог в мой инвентарь.

Исходник(автор основы(99%)- Dik Morris):

Neverwinter Script Source
void CreateObjectVoid(int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE)
{
    CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation);
}
void main()
{
object NPC = OBJECT_SELF;//Ето наш NPC...
object PLE = GetWaypointByTag("my_ast_oldw001");//Таг вейпа к которому нада подойти...
location lLocation = GetLocation(GetObjectByTag("item008"));

if(GetLocalInt(NPC,"NPC")==!TRUE)//Проверка на локалку...
  {
  ActionDoCommand(AssignCommand(NPC, ActionMoveToObject(PLE,FALSE)));//подойдем к плейсу...
  ActionDoCommand(AssignCommand(NPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID)));
  DelayCommand(4.0f,AssignCommand(NPC, CreateObjectVoid(OBJECT_TYPE_PLACEABLE,"item008",lLocation)));

  ActionDoCommand(SetLocalInt(NPC,"NPC",TRUE));//Локалку ставим...
  }
}

Сноска:
CreateObjectVoid – эту команду в тулсете не видно, но ошибки компилятор не выдает.

НОВЫЕ вопросы:
- Где почитать об рандомных разговорах статических Неписей?
- Есть неписи, и когда на улице день, они идут на улицу к лавке, когда ночь – в дом?
Абсолютно не знаю как правильно.
Код(автор - Я):
Neverwinter Script Source
void main()
{
object oHPC = GetNearestObjectByTag("o_HPC001", OBJECT_SELF, 1);
object olABKA = GetObjectByTag("o_laBka001", 0);
object oast = GetObjectByTag("o_piut001", 0);
if (GetIsDay)
{
ActionMoveToObject(olABKA, FALSE, 1.0f);
}
else (GetIsNight)
{
ActionMoveToObject(olABKA, FALSE, 1.0f);
}
}


- У меня не работает СетДей, СетНочь, как из этим боротся?
Aiwan
Во первых, после написания скрипта жми F7. Это компилятор, если скрипт с ошибкой он выдаст строку в которой надо смотреть что ты напартачил.
Neverwinter Script Source
void main()
{
  object oHPC = GetNearestObjectByTag("o_HPC001", OBJECT_SELF, 1);
  object olABKA = GetObjectByTag("o_laBka001", 0);
  object oast = GetObjectByTag("o_piut001", 0);
  if (GetIsDay())
  {
      ActionMoveToObject(olABKA, FALSE, 1.0f);
  }
    else if (GetIsNight())
        {
            ActionMoveToObject(olABKA, FALSE, 1.0f);
        }
}


QUOTE (Nashman @ Jan 4 2006, 03:21)
Проигрывается анимация, возле стола, и старуха как будто бы ставит на стол пирог(o_pie001), на самом деле перед этим, пирог нужно сделать невидимым, а потом когда проиграет анимация – видимым.

Сделать PLC объект невидимым нельзя. Насколько я знаю. МОжно только создать или дестроить его на месте. Ну или измеить его свойства, но для этого надо ковырять твой пирог Мах-ом, и в одно из свойств сделать его невидимым.

Neverwinter Script Source
if(GetLocalInt(NPC,"NPC")==!TRUE) //Шо за отсебятина?
if(GetLocalInt(NPC,"NPC")==FALSE) // Тоды так
if(!GetLocalInt(NPC,"NPC")) // Или так проверь.

Вообще, дуй в тему скриптов новичков и почитай там внимательно скрипты и комметы.
Dik Morris
QUOTE

-Вариант 1:
Проигрывается анимация, возле стола, и старуха как будто бы ставит на стол пирог(o_pie001), на самом деле перед этим, пирог нужно сделать невидимым, а потом когда проиграет анимация – видимым.

Тебе помогут:
Neverwinter Script Source
ApplyEffectToObject
(налаживаем эффект)
Neverwinter Script Source
RemoveEffect
(снимаем эффект)
QUOTE

Вариант 2:
Вместо невидимого пирога, просто создать свой пирог из тегом o_pie001.

Код я тебе, дал. (Кстати нужно указывать не таг, а ресреф)
QUOTE

Просто из инвентаря старухи передать пирог в мой инвентарь.

Ставь в делей:
Neverwinter Script Source
CreateItemOnObject

QUOTE
- Где почитать об рандомных разговорах статических Неписей?

Не знаю, юзай:
(Создай "пустой" диалог, на Action Takens.)
Neverwinter Script Source
void main()
{
switch (Random(3)+1)
   {
   case 1:
   SpeakString("ФРАЗА_1");
   break;

   case 2:
   SpeakString("ФРАЗА_2");
   break;

   case 3:
   SpeakString("ФРАЗА_3");
   break;
   }//В общем что то в этом духе : ).
}

QUOTE
- Есть неписи, и когда на улице день, они идут на улицу к лавке, когда ночь – в дом?

Aiwan скрипт уже привел, но в дополнение ко всему: ЗДЕСЬразбирают подобную ситуацию.
PS:
QUOTE
Сделать PLC объект невидимым нельзя.

Можно 100%.
Neverwinter Script Source
EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY)
- У меня работает на 5+. yes.gif
Aiwan
QUOTE (Dik Morris @ Jan 4 2006, 12:25)
Можно 100%.

good.gif Спасибо, не знал, не знал... scratch_one-s_head.gif
StalkerDtN
Привет всем! yes.gif
У меня такой вопрос: как програмно создать в определенном месте локации тригер ловушки или прицепить его (опять же программно) на дверь или сундук.
Заранее спасибо!

LEX: нафиг в разных темах повторять вопрос? В одной (не в этой, кстати) достаточно. Пока устное предупреждение.
Aiwan
StalkerDtN скачайте мануал с нашего сайта и почитайте. Там ОЧЕНЬ подробно и доступно описано это. Удачи.
Nashman
Приве,
Ребята, ничего не получается, либо тулсет глючный либо...вы догадались. swoon.gif
Возможно повторюсь, но у меня никак нельзя воспользоваться функциией SetDay,SetNight. Я думал как-то через While, но я пытаюсь скрыпты писать месяц, может, максимум и б цыклах ничо не знаю. ПОМОГИТЕ!!!
Нужно не контролировать День и Ночиь и Вечер, а что бы они сами по сибе шли.
Вопрос:
Может быблиотеку подлючить?
-fenix-
QUOTE (Nashman @ Jan 4 2006, 16:33)
Нужно не контролировать День и Ночиь и Вечер, а что бы они сами по сибе шли.

Nashman, ты вообще хоть что-то читал, учил, разберался?

Свойства локи->Опци окружающей среды->Смена дня и ночи. Вот и все!

Если не работают функции, то возможно тупой у тя редактор - меняй его, тут тебе не помогут.
Salasar
А у меня такой вопрос: как сделать так, чтобы НПС при общении с героем, например:
-Ты готов идти?(НПС)
-Да.(герой)
Они перемещались в другую область в заданную локацию?
-fenix-
Вот функции.
Neverwinter Script Source
// The subject will jump to lLocation instantly (even between areas).
// If lLocation is invalid, nothing will happen.
void ActionJumpToLocation(location lLocation)

// Jump to an object ID, or as near to it as possible.
void ActionJumpToObject(object oToJumpTo, int bWalkStraightLineToPoint=TRUE)

// Jump to lDestination.  The action is added to the TOP of the action queue.
void JumpToLocation(location lDestination)

// Jump to oToJumpTo (the action is added to the top of the action queue).
void JumpToObject(object oToJumpTo, int nWalkStraightLineToPoint=1)


Например ставишь в нужном месте вейпоинт, а на строчку в диалоге скрипт.

Neverwinter Script Source
void main()
{
object oPC = GetPCSpeaker(); // это герой
object oNPC = OBJECT_SELF; //это НПС

object oWP_PC = GetWaypointByTag("ТАГ ВЕЙПОИНТА ИГРОКА");
object oWP_NPC = GetWaypointByTag("ТАГ ВЕЙПОИНТА НПС");

AssignCOmmand(oPC, ClearAllActions());//почистим акции на всякий пожарный
AssignCommand(oPC, JumpToObject(oWP_PC));//герой прыгает к вейпоинту
AssignCommand(oNPC, JumpToObject(oWP_NPC));//НПС прыгает к вейпоинту
}
justshurik
Всем привет!
Прежде всего благодарю Lex-а, Dik_Morris-а и Aiwan-a за то что помогли со скриптом.
И хотел бы спросить, сам не могу докумекать, как во время диалога с NPC сделать проверку вещей PC по тегу. Заранее спасибо!
Aiwan
Посмотри ТУТ примеры. Для тебя писалась тема.
Neverwinter Script Source
#include "nw_i0_tool"
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    if(!HasItem(oPC, "ТАГ_ПРЕДМЕТА"))
        return FALSE;
    return TRUE;
}

Salasar
Спасибо за ответ! И Ещё один вопрос. Как сделать так, чтобы НПС при определённом кол-ве жизни( например герой дрался с ним и у НПС осталось 10 или ниже хит-поинтов) начал разговор с героем.
Dik Morris
Neverwinter Script Source
/*
:: Скрипт на onDamaget Npc.
:: Когда игрок, атакует Npc, происход. проверка, если HP у Npcменьше 10
:: то он становится дружественным, и начинаег диалог с игроком.
*/

void main()
{
object NPC = OBJECT_SELF;//Сам НПС
object oPC  = GetLastDamager();//Игрок. (А точнее тот кто атакует Npc)

if (GetCurrentHitPoints(NPC)<=10)//Проверка на HP
   {
   SetImmortal(NPC,TRUE);//Делаем НПС бессмертным;
   AssignCommand(oPC, ClearAllActions(TRUE));//Чистим актионы у игрока;
   AssignCommand(NPC, ClearAllActions(TRUE));//Чистим актионы у Npc;
   AssignCommand(NPC, SpeakString("Стой! Я не хочу больше дратся!"));//Думаю понятно;
   ClearPersonalReputation(oPC, NPC);//Чистим репутацию;
   ClearPersonalReputation(NPC, oPC);//Чистим репутацию;
   ChangeToStandardFaction(NPC, STANDARD_FACTION_COMMONER);//Меняем фракцию на простолюдин; 
   //(можешь сам настроить на какую именно, набери в фильтре конст. STANDARD_FACTION*)
   DelayCommand(1.0f, AssignCommand(NPC, ActionStartConversation(oPC)));
   //Заставляем Npc говорить с игроком.
   }
}

PS: Lex исправил. smile.gif
Lex
QUOTE (Dik Morris @ Jan 6 2006, 12:33)
  AssignCommand(oPC, ClearAllActions());//Чистим актионы у игрока;
  AssignCommand(NPC, ClearAllActions());//Чистим актионы у Npc;

так как это боевые действия, то надо ClearAllActions(TRUE) юзать.
Nashman
QUOTE
дрался с ним и у НПС осталось 10
По поводу скрипта..
А если ХП меньше будет, тоесть в минуса. Ну герой типа все уже...
Пример:
Остется 11 ХП, и тут ПС ударяют ударом в 20ХП. Что будет?


ПС: Если приведенный выше скрипт переделать на ПС.
Lex
не раз говорил, что делать: вешать Immortale в начале такого боя и снимать в скрипте потом.
StalkerDtN
Привет всем!:vava:
Это опять я и опять с тем же вопросом.
Видимо, меня в пршлый раз не так поняли. Т.к. на свой вопрос в мануале ответа я не нашел (хотя возможно плохо искал). Я спрашивл не про то как с помощью toolset нарисоват полигон триггера в локации или поставить галочку на двери возле строчки - ловушка, меня интересует другое:
вот, к примеру, есть у меня локация. В искомой области на данный момент нет триггеров! (в toolsete ничего не рисовалось). Далее разговариваю я с каким-нибудь перцом и он мне придлагает поставить в таком-то месте какой-нибудь триггер я соглашаюсь и втом месте рисуется этот триггер (в моем случаи это ловушка).
Вот именно в этом и заключается вся сложность как это сделать?!
Пробывал из шаблона уже где-то нарисованного триггера сделать копию - неполучилось.
Очень вероятно, что все намного проще, чем мне кажется.
Заранее спасибо.
Lex
скриптами триггер не сделаеть.
StalkerDtN
Если нельзя скриптами сделать триггер, то как же вор создает ловушку в области?
Lex
движковыми скрытыми фунциями, которые нам не доступны.
Kavin
QUOTE (Lex @ Jan 7 2006, 14:17)
скриптами триггер не сделаеть.

Ой... И Encounter-ы тоже нельзя?..
Nashman
Привет,
У меня есть вопрос:
В ниже приведенном коде работает все, но не так как я этого хотел. Это для официантки в таверне. Она бегает между столиками(первые два вейпа) и барной стойкой и кухней. Она должна подойти к столику, подождать, а потом сказать фразу и сразу пойти далле к следующему вейпу... и так далее.

Код:
Neverwinter Script Source
void main()
{
object oW1 = GetWaypointByTag("ast_tavern1_001");
object oW2 = GetWaypointByTag("ast_tavern1_002");
object oW3 = GetWaypointByTag("ast_tavern1_003");
object oW4 = GetWaypointByTag("ast_tavern1_004");

object oNC = OBJECT_SELF;

string speek1 = "Что будете заказывать?";
string speek2 = "Вот Ваш заказ. Еще что-то?";
string speek3 = "Ваше пиво.";
string speek4 = "Извените, но мы такого не продаем.";

ActionDoCommand(ActionMoveToObject(oW1, FALSE, 1.0f));
ActionWait(2.0);

switch (Random(4)+1)
  {
  case 1:
  ActionDoCommand(ActionSpeakString(speek1, TALKVOLUME_TALK));
  break;

  case 2:
  ActionDoCommand(ActionSpeakString(speek2, TALKVOLUME_TALK));
  break;

  case 3:
  ActionDoCommand(ActionSpeakString(speek3, TALKVOLUME_TALK));
  break;

  case 4:
  ActionDoCommand(ActionSpeakString(speek4, TALKVOLUME_TALK));
  break;
  }
ActionWait(4.0);
ActionDoCommand(ActionMoveToObject(oW2, FALSE, 1.0f));
ActionWait(2.0);

switch (Random(4)+1)
  {
  case 1:
  ActionDoCommand(ActionSpeakString(speek1, TALKVOLUME_TALK));
  break;

  case 2:
  ActionDoCommand(ActionSpeakString(speek2, TALKVOLUME_TALK));
  break;

  case 3:
  ActionDoCommand(ActionSpeakString(speek3, TALKVOLUME_TALK));
  break;

  case 4:
  ActionDoCommand(ActionSpeakString(speek4, TALKVOLUME_TALK));
  break;
  }

ActionDoCommand(ActionMoveToObject(oW3, FALSE, 1.0f));
ActionWait(4.0);

ActionDoCommand(ActionMoveToObject(oW4, FALSE, 1.0f));
ActionWait(2.0);
}
StalkerDtN
Привет Nashman!
Я так понимаю у тебя это на HB висит. Если так то скорее всего действия официантки накладываются друг на друга. Попробуй поставить в начало локальную переменную и делай проверку на завершение скрипта. Т.е если она пробежалась по всем точкам и все сказала, то только тогда скрипт запускается заново.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.