Помощь - Поиск - Пользователи - Календарь
Полная версия: ОДИНОЧНЫЙ ВОПРОС
Город Мастеров > РЕДАКТОРЫ > 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
Dik Morris
Вот здесь, есть альтернативная анимация боя, попробуй на ее основе - сделать свою. wink3.gif
Bolat
Эта анимация у меня уже есть, там одни mdl файлы, я их редактил, но не умело.

Редактировал файл Assasin\njh_anims.mdl, хотел чтобы рука при ударе была допустим ниже, дохожу до кадров где бьется удар, отвожу руку вниз, но рука теперь всегда в таком положении.

Подскажите как работать там с анимацией.
Vhall
QUOTE(Bolat @ Jul 20 2006, 07:38) [snapback]88054[/snapback]
Я хочу изменить анимацию людей в nwn.
Как это сделать? Можно ли изменить стандартный файл в NWN или надо писать хак?

http://nwvault.ign.com/View.php?view=Movie...6298&id=188
http://nwvault.ign.com/View.php?view=Movie...6298&id=190

С анимацией - открой a_ba.mdl (только последнюю - ХотУшную), и от него уже прыгай...
QUOTE(Bolat @ Jul 21 2006, 08:10) [snapback]88111[/snapback]
отвожу руку вниз, но рука теперь всегда в таком положении.

Помимо ошибки в анимировании, это может быть ошибка экспорта =)
Попробуй экспортить и mdl plugin и nwmax
denis0k
QUOTE
я немного не понял, а какие могут быть проблемы с отображением ответов игрока во время диалога с НПС? Да пусть их хоть будет 20 или 30, они все будут видны, правда, если на них нет определенных условий, которые необходимо соблюсти, чтобы отобразилась та или иная ветка.
Я вот тоже не понял, почему пункт без условия отображается через раз по известному только ему критерию smile.gif Я собсно этим относительно давно занимаюсь, без моего ведома скрипт с условием никуда там не закрадывался smile.gif

Так что Айван прав походу, битый диалог. Будет время, надо попробовать его заново пересоздать smile.gif
Bolat
a_ba.mdl находится в ammunitiontypes.2da?
С помощью какой проги выдрать его оттуда?
Zirrex
Не могу ни как понять, почему на шарде во время рестарта у игрока иногда пропадают вещи. На стартовой локации есть скрипт, который проверяет, есть ли у игрока запрещенные вещи, и если есть, удаляет. В данном фильтре нет вещей, которые исчезают. Пропадание происходит не столь часто, но когда случается, то чаще уже поздно. Попробую в новой версии сделать проверку на эвентах передачи и потери вещей, чтобы понять, куда все же пропадают вещи, и из-за чего. На всякий случай выкладываю скрипт фильтра:

NSS
// Список вещей для поиска и удаления
void CheckAndDestroy(object oItem);
// Удаление найденных вещей
void DestroySomeItemsInInventory(object oPC);

void CheckAndDestroy(object oItem)
{
    string sItemTag = GetTag(oItem);
    string sItemResRef = GetResRef(oItem);

    // Для примера
    if ((sItemTag == "thing1") ||
        (sItemResRef == "thing2"))
    {
        DestroyObject(oItem);
    }
}

void DestroySomeItemsInInventory(object oPC)
{
    if (GetHasInventory(oPC))
    {
        object oItem = GetFirstItemInInventory(oPC);

        while (GetIsObjectValid(oItem))
        {
            CheckAndDestroy(oItem);
            oItem = GetNextItemInInventory(oPC);
        }

        int i;
        object oSlot;

        for (i = 0; i < 14; i++)
        {
            oSlot = GetItemInSlot(i, oPC);
            CheckAndDestroy(oSlot);
        }
    }
}

Если что-то подобное происходило у вас, поясните, как боролись.
Aiwan
Zirrex, нет ли каких то скриптов дающих сразу вещи РС? Может элементарный глюк, не влези вещи в инвентарь?
Bolat
Vhall

Нашел BIF Editor
Екстракнул из него файлы, там оказался a_ba.mdl.
Радостный запустил 3dmax и обломился - не хочет он импортировать этот файл :-(.

У меня плагин MDL Suit для 6-го макса(хотя стоит 7-ой).
.mdl файлы из альтернативной анимации импортируются, а вот a_ba.mdl нет.
Что же делать?
Zirrex
Aiwan, такие скрипты есть, но они все предназначены для персонажей 1-го уровня, у которых нет опыта. Да и потом, даже если бы они и срабатывали, перед подобными командами стоят скрипты, которые полностью очищают от вещей как самого персонажа, так и его инвентарь. Входящий персонаж тогда бы лишался не пары вещей, а всего.

Если кто не в курсе, то после рестарта все вещи, которые носил персонаж, заново одеваются на персонажа. У меня такое впечатление, что подобная операция происходит и с инвентарем персонажа.

Да, забыл одну деталь описать, когда писал выше. Вещи, которые исчезают, не исчезают совсем, нет, они случайным образом даются другим персонажам, и даже ДМ.
dumbo
Zirrex,
QUOTE
OnAcquireItem
The script attached to this event fires when an item is acquired. The item can be tested against a list of items, and if the item is found an event could occur such as the corpses around the PC arising to fight them in undeath or a journal entry is made. It also fires whenever the OnClientEnter script would fire for a PC. It fires before the OnClientEnter Event starts, for all the items in the PC's inventory (including those equipped!) This is new, quite recent behavior change for this event.


поэтому этот скрипт должен быть максимально "легким". возможно, перенос происходит при каких-то действиях на игрока в скрипте входа(смерть, джамп, итд) - определить где именно будет крайне затруднительно, ибо редко бывает такой "глюк"...
azathoth
Zirrex, дело может быть не в получении, а в потере вещей. Во многих системах есть такая вещь: при выходе персонажа с него снимаются все вещи с "Plot" флагом и отадются другому первому попавшемуся игроку. Это сделано для того, чтобы важные вещи не терялись, а оставались на сервере, и в сюжет не застопорился бы из-за их исчезновения. Симптомы похожи.
Zirrex
azathoth, вещи не Plot. Я вообще на сервере этот флажок не использую. С ним есть некоторые проблемы. Потом, вещи исчезают не в момент выхода, а в момент входа, причем перед этим должен произойти рестарт. dumbo правильно привел описание эвента, все вещи заново выдаются персонажу, когда он входит после рестарта на шард. Очень похоже, что в момент входа нескольких игроков, определенные вещи, какие именно, я знаю, теряют своих хозяев, и выдаются случайным образом. Если в новой версии не проявится подобный "глюк", значит удалось найти причину.
Zirrex
Как обмануть функцию Random? Существует цикл, в который встроен переключатель (switch). В зависимости от настроек с уровнем, изменяется число от 1 до 5. Чем выше уровень персонажа, тем больше число. Чем выше число, тем больше case используется в переключателе. Т.е., если уровень ниже 7, то case всего 4. Цикл прокручивается 1 раз, а если уровень выше 7 уровня, то case 8, и цикл прокручивается 2 раза. Функция Random встроена в цикл, а значит, значение каждый раз новое. Но есть большой шанс, что цифра повторится. Когда цикл прокручивается 2 раза, изменить вторую цифру, если она совпадет с первой, легко, но когда таких чисел становится больше 2, то тут уже сложнее.

Для примера, берем Random(4)+1, и прокручиваем цикл 4 раза. Каждый раз должно получиться другое число, и числа не должны повториться. Но как этого добиться?
dumbo
QUOTE(Zirrex @ Jul 27 2006, 23:57) [snapback]88468[/snapback]
берем Random(4)+1, и прокручиваем цикл 4 раза. Каждый раз должно получиться другое число, и числа не должны повториться

это уже не случайное число. делай массив и на каждом проходе клади туда число. потом сверяй.
virusman
Вот, что говорит Яндекс.
http://www.yandex.ru/yandpage?&q=13740...%25D3%25D4%25C9
Но отсутствие массивов в NWN сильно мешает это реализовать.
В конце концов, можно сделать псевдомассив, расположить там числа и перемешать.
denis0k
По вещам. Если скрипт стоит на OnAcquire, то цикл там лишний, ибо тогда скрипт пробегает по итему Н раз при Н итемах. Если на входе в мод/локу, то попробуй перенести его на триггер, который нельзя обойти. Как-то пробовал давно - некоторые функции в OnEnter локи или мода не работали помнится. Это я к тому, что у нас тоже стоит удаление вещей на входе, на триггере (в основном это ключи), но проблем никогда не было.


По рандому. Варианта 2.

- попроще. Написать свой рандом (на базе нвновского) на сишный аналог. Т.е. берем Random() от большого уникального семени - время в секундах, другие рандомы и т.п., можно кучу разных результатов складывать, умножать на коэффициент, не важно, важно получить уникальное число побольше (скажем десятки тысяч), потом делим вывод рандома на нужный нам дайс с остатком. Что-то типа Random(nSeed) % 6 (получим число 0-5), дальше думаю все понятно.
Конечно тоже не идеал, но совпадений становится меньше, проверно.

- посложней. Записывать все выпадающие варианты. Скажем на локалку на вэйпоинте. В качестве строки. Если чисел до 10 (0-9), то все просто - просто пишем подряд в строку, и пока FindSubstring() выдает что-то отличное от -1 гоняем рандом в цикле. Если числа по 2+ цифр, то ставим между ними к примеру банальный прочерк при записи. Вроде так smile.gif
Aiwan
НВН ский рандом очень привязан к локациям и прочему. В итоге на малой локе рандом будет одни и тем же числом почти всегда. Я с этим столкнулся при случайных боях. У меян было 7 локаций примерно одного размера. В итоге почти неделю я искал ошибку в скрипте, всегда выдавало одно число. Скажем почти всегда. Из 10 раз 9 выпадало одно. Так что с рандомом поосторожней.
Zirrex
Я сделал проще, у меня 20 case строк. В зависимости от требуемого числа (1-5) к стартову числу Random(4)+1 стал прибавлять 5, 9, 13, 17. В итоге у меня получилось, что когда цикл прокручивается 2 раза, число сначала берется в промежутке от 1 до 4, далее от 5 до 8, и т.д. Т.е., даже если цикл прокручивается 5 раз, числа никогда не повторятся.

denis0k, никаких эвентов, отдельный скрипт, который будет срабатывать только в момент смерти существа. А что касается предложения, то тут то все просто. Чтобы получилось уникальное число, можно написать такую строчку: Random(20) + (Random(20) / 20.00).

Про запись уже думал. Только это лишняя проверка, и она заставит цикл прокручиваться лишний раз. А если не выпадет иное число очень долго, то цикл подвесит игру smile.gif
Zirrex
Столкнулся с такой ситуацией, когда невозможно рестартовать модуль. Доступа к серверу нету, скрипта для рестарта тоже нету. И что же? Такой возможности нет даже среди консольных команд. Спрашивается, а почему за время существования игры туда их не внесли? Есть ли вообще возможность рестарта с помощью консоли?
azathoth
Для генерации двух несовпадающих чисел из N можно использовать такую хормулу:
NSS
int var1 = Random(N);
int var2 = (1 + var1 + Random(N - 1)) % N;

Конечно, взятие остатка покруче, чем сравнение, зато все вычисляется за один проход, без потенциальной возможности зависнуть biggrin.gif

Можно вывести хормулу и для большего количества чисел, но, к примеру, на моем компьютере выбор 3х уникальных вариантов из 5 происходил мгновенно, когда это когда-то делал.

---

NSS
void StartNewModule(string sModuleName)

С именем того же модуля должен перезапускать его, во всяком случае в сингле работает.
denis0k
1. Рестарт из игры возможен только способом, написанным выше. Например, с дмской палки (но ее на данный момент конечно же нет, иначе проблемы бы не было).
2. Положить серв грубо, нвнх его должен поднять. Народных умельцев полно.
Milfes
У меня такой вопрос. В диологе NPS должен сказать определённую фразу несколько раз. Как сделать что бы не писать её ещё раз, то есть как обратиться к уже написаной фразе в разных местах.
virusman
Читай туториал Айвана. Там всё написано.
Milfes
Спасибо разобрался, а как сделать, что бы после смерти NPS в журнале появлялась запись.
Waromon
Переделай ЭТОТ скрипт под свои нужды, то есть:

NSS
GiveXPToCreature(oKiller, 500);

Замени на:
NSS
AddJournalQuestEntry("Таг_квеста", Номер_задания, oKiller);


З.Ы: ЛУЧШАЯ_В_МИРЕ_КНОПКА
Milfes
Огромное спасибо! thank_you.gif
Noah
Привет!У меня вопрос,что нового в версии 1.66 чем она лучше предыдущих?Кто знает напишите.
virusman
QUOTE(Noah @ Aug 9 2006, 12:17) [snapback]89299[/snapback]

Привет!У меня вопрос,что нового в версии 1.66 чем она лучше предыдущих?Кто знает напишите.
Смотри файл NWNv166.txt в своей папке с НВНом или раздел патчей на сайте Bioware.
Кстати, последний патч - 1.67.
helvene
QUOTE(virusman @ Aug 9 2006, 12:20) [snapback]89300[/snapback]
Кстати, последний патч - 1.67.

Скоро уже 1.68 будет
Zirrex
Неужели мы наконец-то увидим в игре официальных лошадок? smile.gif Именно в этом патче обещали их, да и многие другие вкусности. Странно, когда известили, что поддерживать НВН больше не будут, и мы не увидим патча 1.68, пропала всякая надежда на дальнейшие косметические улучшения игры.
Milfes
При помощи како функции можно определить тег только что купленного предмета?
Waromon
В смысле только что купленного ????

NSS
string GetTag(object oObject);


QUOTE
Description:

Returns the tag of oObject. Returns an empty string if oObject is not a valid object.
PC's do return a valid value - an empty string! This is because they have no string defined as thier tag (Even GetObjectByTag("") may return a PC object).

Milfes
QUOTE
В смысле только что купленного ????


Последний купленый в магазине обьект. Я правда не уверен, что это возможно.
Zirrex
Milfes, не совсем тебя понятно, если честно. Тэги у вещей такие, какие ты назначил вещам в палитре, когда их делал. Узнать же тэг можно с помощью вышеописанной функции. Тебе надо сделать какую-нибудь вещь с возможностью использования уникальной силы на любой объект, и после использования этой вещи, запускать скрипт, с помощью которого узнавать тэг объекта, на который был наведен предмет.
Neo
QUOTE(Milfes @ Aug 9 2006, 18:33) [snapback]89313[/snapback]
Последний купленый в магазине обьект. Я правда не уверен, что это возможно.

Почему же wink3.gif возможно.
Правда вариант нетривиален spiteful.gif
Объект торговца,
скрипт onOpenStore ставим флаг, указывающий на то, что идет торговля
скрипт onStoreClose снимаем этот флаг
модуль onAcquireItem - проверяем флаг торговли, если true определяем тег предмета (функция указана выше wink3.gif ) и запоминаем в локалку, на тот же модуль к примеру. имхо.

ну или это, onOpenStore - запоминаем весь инвентарь, onStoreClose - сравниваем текущий с запомненным rofl.gif
virusman
QUOTE(NeoJSmith @ Aug 9 2006, 19:22) [snapback]89317[/snapback]

Почему же wink3.gif возможно.
Правда вариант нетривиален spiteful.gif
Объект торговца,
скрипт onOpenStore ставим флаг, указывающий на то, что идет торговля
скрипт onStoreClose снимаем этот флаг
модуль onAcquireItem - проверяем флаг торговли, если true определяем тег предмета (функция указана выше wink3.gif ) и запоминаем в локалку, на тот же модудб к примеру. имхо.
Или просто использовать функцию GetModuleItemAcquiredFrom (а потом - GetObjectType).
Milfes
Всем спасибо разобрался.
Nuprahtor
Здравствуйте.
Как можно запретить персонажу брать второй\третий класс(если можно)?
Elf-Drow
Здравия желаю! Давно меня здесь не было...
Итак вот пара вопросов, которые помогли бы разнообразить модуль:
1) Можно ли сделать, чтобы описание персонажа менялось после разговора с ним?
То есть. Первоначальное описание формирует лишь внешнее представление, а после оно обновляется...
2) Хочется сделать, чтобы пометок на карте не было совсем. Но чтобы они появлялись после того, как персонаж зайдет в оные места. Думаю это можно сделать скриптами, я прав?
3) Нужно, чтобы люди из опред. локации время от времени исчезали из оной( случайно - не в опред. время) где-то на полдня-день, но не слишком часто. Как бы это сделать???
4) Есть ли мысли как более удобно сделать систему отношений. То есть одни персонажи в зависимости от твоего поведения тебя любить не будут, а другие будут?
Благодарю) thank_you.gif
Lex
1. вроде SetDescription нету пока. Обещали в НВН2 и мб в 1.68
2. прав. я делал. Вначале метки ставь не активными, потом активируй. Можно сделать это одним скриптом, но тады надо продумывать систему тэгов меток и связи тэгов с тэгами локаций\локальными переменными на локациях.
3. писать управляющий скрипт. тут в 2х словах не скажешь. Я такое делал (днем ходят по городу, ночью к дверям идут и исчезают)0
4. На локалках. Тут много копий сломано, как лучше. Надо продумать баланс между работой над этим и конечным эффектом.
Waromon
2.

NSS
SetMapPinEnabled(object oMapPin, int nEnabled)


3. В Левор гамал ? Там неписи ночью уходят по домам, вот и погляди как там ето реализованно.
(См. скрипты локи - эвенты oXB, oUserDef...)

4. На локалках, тут в принципе все просто тока нужно в них не запутатся.
Elf-Drow
А вот про систему локалок можно поподробнее? Много проверок на intы? Это не так уж и просто...
Вишес
смотря что надо в твоем модуле. Простейший вариант - на персонажа вешается сокалка и в зависимости от твоих дейсвий ее значение меняется (на+1 или -1 за одно действие). Если тебе нужно, так сказать, общественное мнение, то можно разбить "общество" на группы, по какому-либо признаку(можно по алайментам например) и у каждой будет одна такая переменная.

У меня такой ворос возник: можноли сделать фит-состояние, вроде пауэр атак или экспертизы? и если можно, то как?

и еще возник вопрос относительно parts_bicep.2da и parts_forearm.2da

за что отвечает строчка ACBONUS? (не ужели за броню? 0.02 брони - это круто)
и вот например pmh0forer041.mdl относится к 4 или 41 строчке parts_forearm.2da?

(просто в одном хаке копаюсь, пытаюсь понять, почему в тулсете не отображаются все модели рук, которые есть в хаке)
Lex
QUOTE(Nuprahtor @ Aug 24 2006, 16:57) [snapback]90426[/snapback]
Здравствуйте.
Как можно запретить персонажу брать второй\третий класс(если можно)?

на onPlayerLevelUp (есть такой слот в свойствах модуля) написать скрипт-проверку. Если классов 2/3 (те первый и второй/третий валидны), то отбираем опыт и на левелап заново.
Сам напишешь скрипт?


Вишес, а хз. Это точно не АС. Я по аналогии с другими (стандартными) строками делал и не парил себе моск.
Misty Archer
Доброго времени суток. Вот тут у меня пара вопросов:
1 Как сделать чтобы метка на карте появлялась после разговора с персонажем ( персонаж указывает в разговоре на это место)?
2 Я создал предмет, но он должен быть невидимым и при определенном значении навыка обнаружения должен появляться. Так вот, как сделать невидимым предмет и проводить проверку?
Dik Morris
1:

Размести в модуле вайпоинт с уже подготовленной пометкой.
(Только не забуть убрать галочку на св-ве: Map Note Enabled)
Далее, простой скрип на ActionTakes:

NSS
void main()
{
object oWP = GetWaypointByTag(""); // Здесь укажи Таг вайпоинта

SetMapPinEnabled(oWP, TRUE);
}


2:

В официальных модулях, это уже было реализовано. Посмотри там. wink3.gif
Misty Archer
По поводу второго ответа - можно поподробней.
Aiwan
QUOTE(Misty Archer @ Sep 5 2006, 20:11) [snapback]91104[/snapback]
По поводу второго ответа - можно поподробней

Не думаю что поймешь.. но все же.
NSS
//:://////////////////////////////////////////////
//:: OnEnter  am_ten_skl_searh
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  ПРИ УСПЕШНОЙ ПРОВЕРКЕ СКИЛА ПОИСК, СОЗДАЕМ Item.

ResRef создаваемого объекта равен локальному
стрингу на триггере, для всех классов CLASS_TYPE_ALL,
для всех остальных классов персонально для каждого:
CLASS_TYPE_BARBARIAN, CLASS_TYPE_FIGHTER и т.д.
Поле триггера KeyTag - сложность проверки скилла:
DC_EASY = 0; DC_MEDIUM = 1; DC_HARD = 2;
Флоат "DISTANCE" расстояние на котором создается
объект вокруг РС. Локалка "ACTION_MODE_DETECT"
устанавливает свойство триггера, он сработает только
когда РС в режиме обнаружения.

int CLASS_TYPE_BARBARIAN = 0;
int CLASS_TYPE_CLERIC    = 2;
int CLASS_TYPE_DRUID    = 3;
int CLASS_TYPE_FIGHTER  = 4;
int CLASS_TYPE_PALADIN  = 6;
int CLASS_TYPE_RANGER    = 7;
int CLASS_TYPE_INVALID  = 255;

nwscript

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 31.12.2005 23:24 С новым Годом!
//:://///////////////////////////////////////////
#include "nw_i0_tool"
#include "am_inc_common"

void main()
{
  object oPC = GetEnteringObject();
  //object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
  object oSelf = OBJECT_SELF;
  string sMessage = GetName(oSelf); // Сообщение при обнаружении предмета PC
  string sHench1 = GetLocalString(oSelf, "HENCHMAN_string_1");
  string sHench2 = GetLocalString(oSelf, "HENCHMAN_string_2");
  string sHench3 = GetLocalString(oSelf, "HENCHMAN_string_3");
  string sHench4 = GetLocalString(oSelf, "HENCHMAN_string_4");
  string sHench5 = GetLocalString(oSelf, "HENCHMAN_string_5");
  float f = GetLocalFloat(oSelf, "DISTANCE"); // Расстояние от РС для находки
  if(f==0.0) f = 2.0; // Если нет, то по умолчанию 2 метра радиус
  location lLoc = CreateRandomLocation(oPC, f);
  int iDC = StringToInt(GetLockKeyTag(oSelf)); // Сложность проверки скилла
  if(!GetIsPC(oPC)||GetIsInCombat(oPC)||GetLocalInt(oSelf, "DEACTIVATED"))
      return;

  //-----------------------------------
  //    Ищем в списке помощников Алишан
  //-----------------------------------
  object oHench = GetObjectByTag("AM_HEN_ALISHAN");
  if(!GetIsAssociate(oPC, oHench))
  {
    oHench = OBJECT_INVALID;
  }
  //-----------------------------------

  if(!GetActionMode(oPC, ACTION_MODE_DETECT) && GetLocalInt(oSelf, "ACTION_MODE_DETECT"))
  {
    if (GetIsObjectValid(oHench)) // Хеньчман нас предупреждает, что тут что-то есть
    {
    if(!GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
    {
      SetLocalInt(oSelf, "HENCHMAN_SPEAK", TRUE);
      DelayCommand(0.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_SEARCH)));
      DelayCommand(0.21, AssignCommand(oHench, SpeakString(sHench1)));
    }
    }
    if(GetGameDifficulty() == GAME_DIFFICULTY_EASY || !GetLocalInt(GetModule(), "DEBAG_PC"))
      SendMessageToPC(oPC, "<cу  >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>");
    return;
  }

  SetLocalInt(oSelf, "DEACTIVATED", TRUE);
  string sResRef = GetLocalString(oSelf, "CLASS_TYPE_ALL");  // Предмет для всех
  string sB = GetLocalString(oSelf, "CLASS_TYPE_BARBARIAN"); // Каждому персонально
  string sC = GetLocalString(oSelf, "CLASS_TYPE_CLERIC");
  string sF = GetLocalString(oSelf, "CLASS_TYPE_FIGHTER");
  string sP = GetLocalString(oSelf, "CLASS_TYPE_PALADIN");
  string sR = GetLocalString(oSelf, "CLASS_TYPE_RANGER");
  string sD = GetLocalString(oSelf, "CLASS_TYPE_DRUID");

  int iBestClass = GetCreatureBestClass(oPC); // Ищем лучший класс мультиклассов

  // Дебаг класса
  string sClass;
  if(iBestClass==0) sClass="BARBARIAN";
  if(iBestClass==2) sClass="CLERIC";
  if(iBestClass==3) sClass="DRUID";
  if(iBestClass==4) sClass="FIGHTER";
  if(iBestClass==6) sClass="PALADIN";
  if(iBestClass==7) sClass="RANGER";
  Debug("Лучший класс игрока - "+sClass);

  if(sResRef=="") // Если создаем предметы для классов
  {
    // Приравняем ResRef-ы к единому значению взяв от каждого класса
    if(iBestClass==0) sResRef=sB;  if(iBestClass==6) sResRef=sP;
    if(iBestClass==2) sResRef=sC;  if(iBestClass==7) sResRef=sR;
    if(iBestClass==4) sResRef=sF;  if(iBestClass==3) sResRef=sD;
  }

  if(AutoDC(iDC, SKILL_SEARCH, oPC))
    {
    if(sResRef != "")
    {
        object oItem = CreateObject(OBJECT_TYPE_ITEM, sResRef, lLoc);
        AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_LOOKHERE));
        string sRunScript = GetLocalString(oSelf, "RUN_SCRIPT");
        if(sRunScript!="")
        DelayCommand(2.0, ExecuteScript(sRunScript, oItem));
        if(sMessage == "Предмет + [Текст над РС]" || sMessage =="Item + [Текст над РС]")
          sMessage = "";
        AssignCommand(oPC, SpeakString(sMessage));
        SendMessageToPC(oPC, "<c у >Вы обнаружили предмет.</c>");
        AssignCommand(oPC, ClearAllActions());
        AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPositionFromLocation(lLoc))));
        DelayCommand(0.3, SetCommandable(FALSE, oPC));
        DelayCommand(2.0, SetCommandable(TRUE, oPC));

        if (GetIsObjectValid(oHench))
        {
          AssignCommand(oHench, ClearAllActions());
          AssignCommand(oHench, SetFacingPoint(GetPositionFromLocation(lLoc)));

          if(GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
          {
            DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_YES)));
            DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench2)));
          }
          else
            {
              DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_GOODIDEA)));
              DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench3)));
            }
      }
    }
    else
        {
          // Если мы забыли написать ResRef предметов, то ошибка
          Debug("<cу  >ОШИБКА!</c> Не могу создать объект. Нет ResRef-а для класса - "+sClass);
        }
    }
    else
        {
          if(GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
          {
              AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_CANTDO));
              AssignCommand(oPC, SpeakString("Я ничего не вижу."));
              DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_NO)));
              DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench4)));
              DelayCommand(6.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_MOVEOVER)));
              DelayCommand(6.21, AssignCommand(oHench, SpeakString(sHench5)));

          }
        }
}

Рандомную локацию глянь код в теме базы скриптов.

Вешается на он ентр триггера.
NSS
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;
}


int GetCreatureBestClass(object oCr)
{
    int class1 = GetClassByPosition(1, oCr);
    int class2 = GetClassByPosition(2, oCr);
    int class3 = GetClassByPosition(3, oCr);
    int classlev1, classlev2, classlev3;
    classlev1 = GetLevelByClass(class1, oCr);
    if (class2 != CLASS_TYPE_INVALID)
        classlev2 = GetLevelByClass(class2, oCr);
    if (class3 != CLASS_TYPE_INVALID)
        classlev3 = GetLevelByClass(class3, oCr);
    int BestClass = class1;
    if (classlev1 < classlev2)
        BestClass = class2;
    if (classlev2 < classlev3)
        BestClass = class3;
    return BestClass;
}
Misty Archer
Спасиб, будем разбираться biggrin.gif .
Опять новый вопрос:
1 хочу вставить в книгу рисунок карты, возможно ли это?
2 можно ли сделать что-то типа проверки на ловкость при вскрытии замков
( так же хочу сделать в модуле отмычки которые будут влиять на результат этой проверки если их держать в руках, как это зделать)
Aiwan
1. Нет.
2. Слот OnUnlocked. Проверка идет и так. Отмычки делай как в палитре + к скилу открыть замок. Вот тебе скрипт на экспу. Мож поправить чо надо.
NSS
//:://////////////////////////////////////////////
//:: OnUnlocked am_dul_unlocked
//:: Copyright © 2004 WRG!
//:://////////////////////////////////////////////
/*
              УНИВЕРСАЛЬНЫЙ СКРИПТ
    РАЗДЕЛЕНИЕ ХР ЗА ОТКРЫТИЕ-ОБЕЗВРЕЖИВАНИЕ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 09.05.2004
//:://////////////////////////////////////////////
#include "nw_i0_tool"
void main()
{
int iL = GetLockUnlockDC(OBJECT_SELF);
int iT = GetTrapDisarmDC(OBJECT_SELF);
object oDisarmed = GetLastDisarmed();
object oUnlocked = GetLastUnlocked();
//================ ОТКРЫВАЕМ ЗАМОК ================
if ((!GetLocalInt(OBJECT_SELF, "UNLOCKED"))&&(GetIsObjectValid(oUnlocked)))
  {
  SetLocalInt(OBJECT_SELF, "UNLOCKED", TRUE);
  if (HasItem(oUnlocked,GetLockKeyTag(OBJECT_SELF))) return;
  if (GetIsPC(oUnlocked)) // Если замок вскрыл РС
    {
    GiveXPToCreature(oUnlocked, (iL * GetHitDice(oUnlocked)/3));
    // XP = DC двери умноженное на 1/3 уровень РС
    return;
    }
  else // Если замок вскрыл Henchman
    RewardPartyXP((iL*2), GetMaster(oUnlocked));
    // XP = DC двери умноженное на 2
  return;
  }
//=============== ОБЕЗВРЕЖИВАЕМ ЛОВУШКУ ============
if ((!GetLocalInt(OBJECT_SELF, "DISARMED"))&&(GetIsObjectValid(oDisarmed)))
  {
  SetLocalInt(OBJECT_SELF, "DISARMED", TRUE);
  if (HasItem(oDisarmed,GetTrapKeyTag(OBJECT_SELF))) return;
  if (GetIsPC(oDisarmed)) // Если ловушку обезвредил РС
    {
    GiveXPToCreature(oDisarmed, (iT * GetHitDice(oDisarmed)/3));
    // XP = DC ловушки умноженное на 1/3 уровень РС
    return;
    }
  else // Если ловушку обезвредил Henchman
    RewardPartyXP((iT*2), GetMaster(oDisarmed));
    // XP = DC ловушки умноженное на 2
  }
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.