Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Lex
Айв, не говори ерунды, если все через Assign то никакого удаления нет, так как очередь на НПС. Главное удалить триггер не сразу-же а с небольшой задержкой. полсекунды вполне хватает, чтобы длинющую очередь выстроить.
Aiwan
Ну это ты знаешь. А он не волокет в тонкостях. Ему нужно просто и что бы было понятно и работало. Дальше он сам сделает как поймет. smile.gif
_kaa_
Вопрос по анимации. Как сделать анимацию атаки? Именно анимацию, а не заставить PC нападать. Констант таких я не нашел, возможно ли это?
DBColl
Стандартными способами нельзя. Можно поменять саму анимацию, на одной из существующих констант. То есть выдрать анимацию одиночной атаки (допустим с длинным мечом) и заменить ею одну из существующих анимаций. Само собой без хака не обойтись. Подробнее я к сожалению не смогу объяснить. Надеюсь Айс это сделает smile.gif. [гы, глядя в сторону Айса...]
_kaa_
Не, спасибо. Либо просто - либо никак smile.gif
Lex
да, к сожалению констант нет.
Elven king
Такой вот вопрос, как вам кажется, как легче создать расовые плюшки для Дроу тоесть чтобы он мог сразу использовать темноту и как сделать волшебный огонь, который просто появляется как эффект вокруг жертвы?
DBColl
Мне кажется здесь надо переписать чуток 2да по фитам и магии... По-другому вроде новые спеллы не дать...
Elven king
Ну... это то да, а вот как быть с тем чтобы магия Darkness была врождена, тоесть как бы использовалась к примеру два раза в день?
Aiwan
Elven king слишком пространнственный вопрос. Конкретней ситуацию опиши. Про спелл, можно надеть шкурку на РС. Но для шарда это не очень sad.gif
Elven king
Нет, тут не для Шарда, а так для одиночной игры, вся ситуация сосотит в том, что мне нужно реализовать суб расу Дроу, которая как известно обладает двумя способностями(на даный момент хватает только спела).
И можетете ктонибудь сказать какой командой можно одеть эту шкуру?
aleVandal
Такой вопрос:
можно ли каким нибудь образом восстановить игроку запомненные, но уже использованные спеллы (без отдыха)?
Ато я в тулсете знаю только возможность уменьшить количество кастов запомненного спелла, а вот обратной возможности так и не нашел... shout.gif
Aiwan
2 Vestel

Этот скрипт ставишь на OnEnter локации. Делаешь невидимого монстра с нейтральной фракцией ко всем и делаешь его плотовым. Для диалога немного переделай. Сможешь?
Код

//::///////////////////////////////////////////////
//:: Name
//:: Copyright (c) 2004 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On:
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject(); // GetPCSpeaker();
  if (!GetIsPC(oPC) || GetLocalInt(oPC, "START_PC")) // ДЛЯ ЛОКАЦИИ
       {return;}
  if (GetIsPC(oPC))
    {
    SetLocalInt(oPC, "START_PC", TRUE);
    AssignCommand(oPC, ClearAllActions());
    object oSpeaker=CreateObject(OBJECT_TYPE_CREATURE,"ResRef_невидимого_НПС",GetLocation(oPC),FALSE);
    AssignCommand(oSpeaker, ActionStartConversation(oPC, "dlg_assignskills"));
    }
}


В конце своего диалога на слот Normal и слот Aborted делаешь кусочек кода:
Код
void main()
{
DestroyObject(OBJECT_SELF, 0.5);
}
Вестель
Вопрос первый.
При первом входе персонажа на сервер, должен срабатывать скрипт, который начинает с ним диалог (вроде как на Энтарионе "система именных оружий" и т.д). Этот же диалог должен начинаться после каждого ЛевелАпа. Проверка на первость входа идет через стандартное Deity по факту наличия зарезервированных символов в котором и должен запускаться диалог.

С подсказки Aiwan'a была создана НПС (таг: "MCS_TALKMAN"), которой было заданно имя, которая будет вести диалог. Она спрятана в дальнюю локацию с названием "Секретная Лока" (таг: "SECRET_AREA").
При использывании конструкции:
Код
objeсt oMCS=GetObjectByTag("MCS_TALKMAN");
ActionStartConversation(oMCS,"dlg_testdialog",TRUE, TRUE);
диалог не начинается.
Может быть надо как-то указывать, что действие происходит в разных локациях или что? Буду рад любой помощи.

Вопрос второй.
В диалоге должна появляться фраза использующая переменные. Типа
Цитата
"Уже прошло 2.. 3.. 6.. 8.. дней из 11 отпущенных".
Переменную с LocalInt'a я считать могу, а вот, как вставить ее в диалог не разобрался. Может кто-нибудь подсказать?..
Aiwan
2 Elven king делаешь шкурку со свойствами. Код впихивай хоть куда.
Код

void main()
{
 object oPC = GetFirstPC();
 DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC)); // если уже висит какая-нибудь шкурка
 object oItm = CreateItemOnObject("ResRef шкурки", oPC, 1);
 AssignCommand(oPC, ActionEquipItem(oItm,  INVENTORY_SLOT_CARMOUR));
}
Вестель
В догонку:

как в том же диалоге сделать, чтобы до тех пор пока пользователь не выбрал "Выход" у него были одни и те же фразы?

Скрипт работает, только НПС почему-то не невидимый.. Как сделать? Я в непонятках.. Пробывал на него Перманентный Импрувнутый Инвиз вешать - не помогает..
DBColl
Цитата
как в том же диалоге сделать, чтобы до тех пор пока пользователь не выбрал "Выход" у него были одни и те же фразы?

Делаешь Copy строки на которую надо переходить постоянно и вставляешь ее как Paste As Link в конец "цикличных" веток диалога.

Цитата
Скрипт работает, только НПС почему-то не невидимый.. Как сделать? Я в непонятках.. Пробывал на него Перманентный Импрувнутый Инвиз вешать - не помогает..

Не надо инвизов. В палитре есть невидимый непись. Полистай Appearance в свойствах существа. Invisible Creature вроде называется...
Aiwan
Вестель как ты представляешь диалог, если твой персонаж за три девять земель? biggrin.gif Тогда уж так:

Код

void main()
{
object oPC = GetFirstPC();
object oMCS=GetObjectByTag("MCS_TALKMAN");
AssignCommand(oMCS, ActionJumpToObject(oPC));
AssignCommand(oMCS, ActionStartConversation(oPC,"dlg_testdialog",TRUE, TRUE));
}

Но если этот персонаж будет так же использован другим игроком? Лучше сделай код таким как я написал выше в посте. Создал, дестроил объект.
Вестель
Создаваю, дестрою..
Цитата
В палитре есть невидимый непись. Полистай Appearance в свойствах существа. Invisible Creature вроде называется...

Null Human в моей (vts027) версии Toolset'а оно завется.. Но Invisible Creature я искал долго.. Теперь все работает..

Теперь если можно, расскажите по подробнее, как с токенами работать..
DBColl
Токены устанавливаются через SetCustomToken(400, "стринг"); // 400 - это пример номера
Затем в диалоге ты просто пишешь <CUSTOM400> и вместо него в игре в диалоге появляется "стринг".

Вот и все wink3.gif.
Аваддон
Я для вот думал как сделать такой скриптик ...
Заходит игрок в гостиницу отдохнуть, снимает номерок. Заходит туда и жмет рест. на ресте с него снимаются все шмотки и кладуться в шкаф а сам он рухает спать на коврик. Вокруг него темнеет сон длится минуту. Но это я все знаю как реализовать. Я вот что хотел:
Значит пока он спит рандомно в случае 1 из 40 допустим, включается SetCutScene то несть он не может отменить сон и управлять не может. В коридоре гостиницы появляется воришка, камера переходит к нему, он делает вид что ковыряется в двери, дверка открывается, он вскрывает шкаф со шмотом ПС копается там. После этого воришка убегает, CutScene заканчивается перс в стает и недощитывается в шкафу рандомно 2х вещей.

З.Ы. Но шмотки удалятся только если воришка откроет сундук, потому что вдруг там засаду устроятwink3.gif))
Aiwan
Аваддон это можно реализовать, достаточно просто. Во время отдыха запускай функцию Random и как только получишь нужный вариант просто на задержку ставь скрипт, вот кусок кода:

Код

void main()
{
object oPC = GetFirstPC(); // или как надо определи оРС
int i = (Random(100));
if (i < 5)
 {
 DelayCommand(20.0, ExecuteScript("скрипт_сценки", oPC));
 }
}


Но тебе надо будет круто нарисовать катсценку. Вней все вейпы бери GetNearest**** что бы можно было в нескольких местах использовать. Ну и соответственно вейпы и прочее расставь везде.
Аваддон
Ага, я вот еще что хотел спросить.
У меня GetObjectByTag отлично работает, а вот GetNearestObjectByTag вообще НОЛЬ! Не работает. Или надо это делать как AssignCommand?
Добавлено в [mergetime]1087585512[/mergetime]
P.S. 1. Зачем нужна задержка?
2.Как я понял Инта рандомно выпадает от 0 до 100, и если она меньше 5 то скрипт пускается? А как сделать чтобы вероятность была 1 из 40?
Aiwan
Цитата
У меня GetObjectByTag отлично работает, а вот GetNearestObjectByTag вообще НОЛЬ! Не работает.

Не можеть такого быть. shok.gif Это одно и то же, только второе берет БЛИЖАЙШИЙ объект с таким тегом.
Задержка нужна для красоты crazy.gif просто будет прикольней отдохнуть немного и бац! Сценка.
Ну так посчитай, сделай рандом из 40 и прировняй int к постоянному числу, например 10. Будет твой результат. Но я что то не помню что бы 40 раз отдыхал в игре. Лучше уж 25% или 30...
Добавлено в [mergetime]1087587538[/mergetime]
У тебя объект надеюсь в ЭТОЙ ЛОКАЦИИ где происходит действие кат сценки? :?)
Аваддон
Да, только Nearest я так к слову спросил потому что, у меня такая вещь на отдыхе - когда костер разжигаешь - дрова должны изчезнуть. Когда я пишу DestroyObject(GetNearestObjectByTag("rest_wood")); дрова не изчезают хотя я стою рядом с ними, но стоит мне написать DestroyObject(GetObjectByTag("rest_wood")); и бац - все работает.. Не понимаю в чем дело.
Аваддон
А, все допер в чем ошибка. Там надо же еще писать от кого ближайший объект lol.gif
А теперь другой вопрос как сделать чтобы объект создавался с задержкой?
Ну например я срубил дерево а через 500сек там еще одно выросло?
Я пытался совместить DelayCommand и CreateObject - бестолку. Написал отдельную функцию - и поставил ее на дилэй - тоже не появляется..вот фигня какая.
Aiwan
Вот кусок моей инклюды, работает все как часы. Хочешь просто объект, хочешь с новым тегом крееть.
Код

//::///////////////////////////////////////////////
//:: Name: am_libcutscen
//:: Copyright (c) 2004 WRG!
//:://////////////////////////////////////////////
/*
              БИБЛИОТЕКА ДЛЯ СЦЕН
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan      Aiwan@e-mail.ru
//:: Created On: 22.03.2004
//:://////////////////////////////////////////////

// ФУНКЦИЯ СОЗДАНИЯ ОБЪЕКТА С НОВЫМ ТАГОМ
// int iAnimation = АНИМАЦИЯ ПРИ ПОЯВЛЕНИИ
// string sNewTag = "НОВЫЙ_TAG_ОБЪЕКТА"
void ActionCreateNew(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag);
// ФУНКЦИЯ СОЗДАНИЯ item ОБЪЕКТА
// sItemTemplate - ResRef объекта
// oTarget - у кого создаем объект
// nStackSize - количество в стеке
void ActionCreateItem(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1);
//------------------------------------------------------------------------------
void ActionCreate(int nObjType, string sCreature, location lLoc);

void ActionCreate(int nObjType, string sCreature, location lLoc)
{
   CreateObject(nObjType, sCreature, lLoc);
}

void ActionCreateNew(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag)
{
 CreateObject(nObjType, sCreature, lLoc, FALSE, sNewTag);
}

void ActionCreateItem(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)
{
 CreateItemOnObject(sItemTemplate,oTarget, nStackSize);
}
/*void main()
{

}


Код
DelayCommand(30.0, ActionCreate(sCreature, lLoc));

Это кусок кода из скрипта.
Код
   DelayCommand(33.5, ActionCreateItem("key_shop_nouse", oPC, 1));

Это тоже. Все пахает.
Аваддон
Спасибоsmile.gif Так так, а кто у нас тут специалист по бд? Или может это не с БД связано...
Вообщем очень заинтересовался, как можно сделать сейф предметов для мультика? Тоесть человек положил в сейф предмет, ззакрыл, получил расписку и ушел. Сервак перезагрузился, он зашел отдал расписку, сказал кодовое слово и получил обратно свои предметы...
Если конечно ни у кого ничего такого не написано, то подайте хотябы идею как реализовать это. Вписывать теги всех вещей - исключено! Их там столько...
_kaa_
Цитата
Спасибо Так так, а кто у нас тут специалист по бд? Или может это не с БД связано...
Вообщем очень заинтересовался, как можно сделать сейф предметов для мультика? Тоесть человек положил в сейф предмет, ззакрыл, получил расписку и ушел. Сервак перезагрузился, он зашел отдал расписку, сказал кодовое слово и получил обратно свои предметы...
Если конечно ни у кого ничего такого не написано, то подайте хотябы идею как реализовать это. Вписывать теги всех вещей - исключено! Их там столько...


Есть несколько способов. Если хочешь именно с распиской за каждую вещь - можно не используя БД сделать сохранение любой вещи, _котороая есть в палитре_, конечно при условии, что у тебя модуль "как у людей" построен и тег==ресрефу.
С БД можно сохранять любые вещи, даже самодельные, выданные ДМ-ом. Расписка и кодовое слово тут не нужны, у каждого игрока свой инвентарь в сундуке (т.е. кто открыл - того сундук и прочитался). Есть ограничения на этот случай тоже.
1) если писать в БД все объекты сразу, то получишь большой лаг (по одному предмету - еще нормально). 2) При удалении из БД объекта размер самой базы не уменьшается и нужна принудителньая упаковка баз данных внешней утилитой.

В другом топике, "Шарды", я выложу пример такого сундука (в течение дня smile.gif )
Аваддон
Интересная идея посетила. Вот воры крадут - это нормально ведь у кого то спот не прокачен. Но когда воры крадут в городе где полно охраны это уже прям не охрана а музей восковых фигур. Как можно прописать чтобы охрана становилась хостайл для вора если увидит что вор у кого то крадет?
Может OnHeartBit арены города поставить проверку -какие навыки используются и если используются PickPocket выставлять хостайл?
Lex
на дистурб НПС напиши скрипт, чтобы он заорал Воры! Хватаешь ближайшего стражника и атакуешь им игрока. Не надо делать репутацию 0. Это не очень логично.
Аваддон
Да но это будет работать если воры обносят НПС а если они обносят других игроков?
Lex
тогда незнаю
DBColl
Тогда пусть другой игрок ему и стучит по голове, если заметил кражу. Гы. smile.gif
Аваддон
О даsmile.gif))
_kaa_
Цитата
Да но это будет работать если воры обносят НПС а если они обносят других игроков?


Вот простой вариант: отслеживать событие модуля OnUnacquire() и проверять, если на вещи стоит флаг stolen - большая вероятность что вещь только что сперли и можно натравить на игрока стражника (в любом случае нечего ходить с краденными вещами).
Правда это событие глючит когда крадут деньги или вещи, которые складываются (подробнее в лексиконе)
DBColl
Каа, а почему нельзя ходить с крадеными вещами? Стражники ведь не досматривают! Прикинь картину: ты идешь себе, идешь, появляется патрульный стражник и вдруг набрасывается с криком: "ВОР! Замочу гада!". Достает АК-47 и начинает палить... Хм... понесло...

Все бы ничего, да вот я-то эту вещь поднял с брошеного трупика какого-то игрока... (что сделаешь, если я отыгрываю свой LE). Гы. :ss: crazy.gif
Аваддон
Хм а почему на OnUnAquire это же наоборот когда сбрасываешь вещь?! unknw.gif А тогда можно я думаю вот как сделать: Значит на OnAquire ставим проверку приобретенной вещи - если stolen, то проверяем арену, если это город - проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..." и аттачит вора... Или нет...Даже вот что лучше - он вора атачит и на каждом ударе проверяет здоровье. Если здоровье вора <0>-10 то есть вор уже на земле корячится то он типа говорит - пройдемте в отделение, тут ему прибаляется 10хп чтоб ожил и телепортится в камеру тюрьмы smile.gif rolleyes.gif
Aiwan
Цитата
проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..."

Лучше кин автоDС на скрытность или воровство твоего РС и гварда. Прошел бросок, можешь пробежаться мимо стражника и отпукаться shok.gif за углом. Нет, тогда кричи: "Эй стой! Что то ты подозрителен!" Старт диалога а там можешь и проверочку делать, типа убедил стражника - отмазался smile.gif Вот стимул качать фиты spiteful.gif
Аваддон
Во, Айван ты всегда что то клевое подаешьsmile.gif А если игрок просто закроет диалог?! Есть такая фишка? что тогда делать - нападать?
Aiwan
Ты имеешь ввиду это?:
Цитата

Current Files (Normal, Aborted) – эти слоты созданы для того, что бы можно было присвоить какие-то события на прерывание диалога или на простое завершение. Обычно там стоит скрипт «nw_walk_wp» для следования NPC по заданным точкам пути, после диалога.

Ставь туда свой скрипт, можешь хоть на начало диалога занаво, типа прервал, забивай стек команд и старт конверсатион. ДА в принципе, что хочешь влепляй. Можно и атаку, типа, "Ах, ты еще и разговаривать не хочешь!?"
Вестель
Цитата
А если игрок просто закроет диалог?! Есть такая фишка? что тогда делать - нападать?

За ухо и об землю!
Действительно хорошая идея: делать противобросок Spot vs. Pick Pocket тех кто находится в 10 метрах.. А если плеер, то выдавать системное сообщение: "Вы заметили, что <Bacja> ворует.." Тогда будет прикольный момент с покрывательством и последующим шантажом. yes3.gif .. А стражник заметивший пускай, сначала предупреждает dirol.gif "Пройдемте в отделение", а при попытке убежать, не отвечать, укастовке начинает ответные действия...
DBColl
Ребят, а вы не думали, что можно проверять и устанавливать на каждую приобретенную вещь (в OnAcquire) переменную = Тэг(OBJECT_SELF) + ID хозяина. Тем самым можно дополнительно проверить краденая ли вещь... Но это идея... Возможно и не очень правильная для шарда, но все же...
_kaa_
Цитата
Каа, а почему нельзя ходить с крадеными вещами? Стражники ведь не досматривают! Прикинь картину: ты идешь себе, идешь, появляется патрульный стражник и вдруг набрасывается с криком: "ВОР! Замочу гада!". Достает АК-47 и начинает палить... Хм... понесло...

Все бы ничего, да вот я-то эту вещь поднял с брошеного трупика какого-то игрока... (что сделаешь, если я отыгрываю свой LE). Гы.


Если просто поднимать вещь - флаг stolen не ставится, только когда воруешь.

Цитата
Хм а почему на OnUnAquire это же наоборот когда сбрасываешь вещь?!  А тогда можно я думаю вот как сделать: Значит на OnAquire ставим проверку приобретенной вещи - если stolen, то проверяем арену, если это город - проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..." и аттачит вора... Или нет...Даже вот что лучше - он вора атачит и на каждом ударе проверяет здоровье. Если здоровье вора <0>-10 то есть вор уже на земле корячится то он типа говорит - пройдемте в отделение, тут ему прибаляется 10хп чтоб ожил и телепортится в камеру тюрьмы 


Ага, именно OnAcquireItem. Там можно получить что это за вещь, кто прежний хозяин и кто нынешний. Если вещь stolen, прежний хозяин игрок\НПС и нынешний - игрок, то вещь либо сперли, либо бартером передали. Но баги такие же - на золото не вызывается этот event.
Да, с этим эвентом еще один прикол. Когда игрок заходит на шард - каждая вещь из его инвентаря вызывает этот эвент. Это не бага, это фича smile.gif
Tarre Talliorne
Кстати - с реакцией гварда можно сделать проще: фит нокдаун и через 0.1 сек эффект нокдаун - потом изменение отношения на нейтральное и разговор - плати штраф за то-то и то-то. Проще тем, что можно обойтись без тюрьмы... Даже если у игрока нет денег - берут шмотом и дают сдачу :-) , а если и шмоток нет, у игрока начинают рости ДОЛГИ spiteful.gif . А если при диалоге перс нарывается на агрессию и нападает, его всегда можно выруюить заново и удвоить штраф pleasantry.gif . Могу кинуть код (сыроват он еще, но ...) - просто у нас в модуле у части охраны такое поведение biggrin.gif .
Lex
в базу кидай
Tarre Talliorne
Отшлифую - кину...
Tarre Talliorne
Вопроссс: мне нужно определить, висит ли на ПС эффект увеличение КБ, вроде все в порядке - перебираю все эффекты и т.д. но все равно в результате скрипт возвращает 0... Никак не допру, в чем проблема.
Код

       int iResult = 0;
       object oPC = GetPCSpeaker();
       effect eEffect1 = EffectACIncrease(1);
       effect eEffect2 = EffectACIncrease(2);
       effect eEffect3 = EffectACIncrease(3);
       effect eMSD = GetFirstEffect(oPC);
       while (GetIsEffectValid(eMSD))
       {
           if (eMSD == eEffect1 ||
               eMSD == eEffect2 ||
               eMSD == eEffect3  )
           {
           iResult = 1;
           }
       eMSD = GetNextEffect(oPC);
       }
       return iResult;
DBColl
Tarre
А кто ж так эффекты сканирует? biggrin.gif
effect eEff = EffectACIncrease(...) - создает новый "экземпляр" эффекта. Это не нужно тебе в данной ситуации.
Надо делать так:
Код

.........
      while (GetIsEffectValid(eMSD))
       {
           if (GetEffectType(eMSD) == EFFECT_TYPE_AC_INCREASE)
              iResult = 1;
           eMSD = GetNextEffect(oPC);
       }
.........
Tarre Talliorne
Спасибо... хех, прикол в том, что с визулками все отлимчно работало... Да, кстати, сразу написаля инлюд - через пять минут выложу в базе скриптов smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.