Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Milfes
Ты 2 параметр указал не верно, вместо ABILITY_DEXTERITY должно быть ItemPropertyAbilityBonus(ABILITY_DEXTERITY,1). 1 параметр это то что мы повышаем, а на сколько увеличится бонус ловкости даваемый предметом. Дело в том что свойство предмета это тип данных. Например можно записать так
Neverwinter Script Source
itemproperty ipDex=ItemPropertyAbilityBonus( ABILITY_DEXTERITY, 1 );
      AddItemProperty( DURATION_TYPE_PERMANENT, ipDex , GetObjectByTag( "SKURKA" ) );

Все свойства начинаются с ItemProperty, а дальше в зависимости, что хочеш добавить(ItemPropertyACBonus(),ItemPropertyBonusFe
t() и т.д.)
Lex
Цитата(Dik Morris @ Dec 23 2007, 12:07) *
Впрочем и не тянет уже... Откровенно говоря.
Помните? Былые времена? Заходишь... "Новые сообщения"...

предатель smile.gif
Белатрис
Лекс, неужели даже ты не знаешь ответов на вопросы:

Код
П.С. Никто не знает, как проверить, открыл ли ПС дверь?(скрипт на OnHeatbat)

П.П.С. И еще, как при создании NPC сделать так, чтобы он сверху спускался? Как пауки в ХОТУ.

sad.gif

Цитата
Помните? Былые времена? Заходишь... "Новые сообщения"...
...А там...

Просто раньше большинство вопросов были новыми, а сейчас люди ругаются на постоянно повторяющиеся, не хотят отвечать, так как ответы были даны по несколько раз. Да и тулсет раньше был более популярен, чем сейчас.
Гостей здесь всегда много. Готов поспорить - 50% ищут какую-то инфу по ПЛ, 35% по НВН или новые моды, и лишь 15% пытаются с помощью ГМ построить "свое чудо". declare.gif
Жаль, что не у всех терпение и воля есть, как, к примеру, у Лекса. Вон, уже демку выпустил на ядре НВН2, респект, что ж есчо сказать? =)
Dik Morris
2 Белатрис, я прекрасно знаю почему, и что случилось, прекрасно понимаю смысл выражения "все имеет свойство надоедать", это --- всего лишь банальные воспоминания.
Ведь раньше трава была зеленее, небо светлее
Не стоит обращать на них внимания, а на воспоминания подобного рода, с моей стороны тем паче не стоит.
Кстати, интересно... а ведь вопрос, по-поводу пауков из HotU (SoU --- склеп) уже разбирался... так что вопспользуйся поиском. Я на сто процентов уверен, что это уже было. Помню как сейчас. Или Aiwan или Zirrex отвечал. Наверное последний (дело в том, что нужно накаладывать эффект. Какой? Поиск).

Насчет двери. Я наверное уже отстал от крутых технологий, хе-хе.
Но один из вариантов решения, лично мне, видится так:
  • Если есть дверь, дверь которую открывает игрок, то можно, соответственно "запомнить" этого героя. Наложив на него/дверь локальную переменную (не забыв проверить, что это именно игрок, если первый случай), а затем, вообще-то и проверять по-ней всё что требуется (это применимо если я тебя правильно понял, конечно же).

Не знаю, понятно ли я объяснил (понял), но думаю подобный ход лучше банального выкладывания кодов, как это делал(и, ют) ранее.
Lex
Цитата(Белатрис @ Dec 24 2007, 13:27) *
П.П.С. И еще, как при создании NPC сделать так, чтобы он сверху спускался? Как пауки в ХОТУ.

последний параметр в функции CreateObject поставь TRUE
Или наложить эффект Desapear/apear.. точно уже не помню, смотри описания.
Цитата(Белатрис @ Dec 24 2007, 13:27) *
а сейчас люди ругаются на постоянно повторяющиеся, не хотят отвечать

ну щас уже ругаться перестали. просто или отвечают или молчат. smile.gif Мне не влом ответить, написать 100ый раз. (как например про "появление как пачки в ХОТУ").
Цитата(Белатрис @ Dec 24 2007, 13:27) *
П.С. Никто не знает, как проверить, открыл ли ПС дверь?(скрипт на OnHeatbat)

лучше всего проверять через слот onOpen. Если через него нельзя совсем - бери Состояние двери (GetObjectState) и ищи последнего, кто дверь открывал (GetLastUsedBy / GetLastOpenedBy (GetLastOpener.. без тулса под рукой не помню точных имен))
Белатрис
Обоим большое спасибо! Паучки теперь "летают" declare.gif Гхы )))

Блин, а вот поиск нифига не работает. Я серьезно - ошибку выдает, типа я неправильно ввел...

sad.gif Лекс, не напомнишь, как перевести из int в string? На С++ atoi() и atof(), но в тулсете ошибку выдает... Я помню, что уже спрашивал, но найти не смог. Поиск не пашет...

П.С. И, кстати, почему этих функций нет нигде, ни циклов, ни операторов ветвления... Где их отыскивать? или это слишком
лементарное? rolleyes.gif

Lex
Цитата(Белатрис @ Dec 25 2007, 03:28) *
nt в string?

не поверишь, IntToString
(для таких вещей юзай фильтр-поиск в боковом меню. По ключевым словам ищется на ура)
Цитата(Белатрис @ Dec 25 2007, 03:28) *
П.С. И, кстати, почему этих функций нет нигде, ни циклов, ни операторов ветвления... Где их отыскивать? или это слишком
лементарное?

эт ты про что? каких функций?
Белатрис
Ну, я имел ввиду операторов rolleyes.gif

Спасибо.

Цитата
(для таких вещей юзай фильтр-поиск в боковом меню. По ключевым словам ищется на ура)

Говорю же - не пашет поиск... ошибку выдает. И тот и другой...

Тут есчо вопросик.

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

П.С. И еще. У меня сразу после драки игрок и НПС становятся друзьями и НПС должен начать диалог. Но из-за того, что они только что дрались этого делать нельзя... Как обойти сие ограничение?

Заранее спасибо.
azathoth
Цитата(Белатрис @ Dec 25 2007, 12:51) *
Можно ли дверь закрыть на ключик, чтоб потом не открывалась? А то у меня дверь закрыта, ключ берешь, открываешь, кое-что происходит и дверь закрывается. Вот только потом ее можно свободно открыть...

в свойствах двери ищи поле "отобрать ключ после открытия"
Цитата(Белатрис @ Dec 25 2007, 12:51) *
П.С. И еще. У меня сразу после драки игрок и НПС становятся друзьями и НПС должен начать диалог. Но из-за того, что они только что дрались этого делать нельзя... Как обойти сие ограничение?

ClearAllActions(TRUE);
Белатрис
Цитата
в свойствах двери ищи поле "отобрать ключ после открытия"

Я так делал, и знаешь, все равно можно открыть! И без ключа... unsure.gif

Следующий скрипт вешается на строку диалога. Чел должен проверить количество предметов в интвентаре и посчитать их. Но игра зависает и через несколько секунд выводится сообщение, что слишком много инструкций... Что не так?
Neverwinter Script Source
const int V = 10, T = 60;
int Gold;
void main( )
{

    int i;
    i = 0; Gold = 0;
    // ВОЛК
    object shkura = GetObjectByTag( "w_gray" );
    if( GetIsObjectValid( shkura ))
    {
    while( GetIsObjectValid( shkura ))
    {
        DestroyObject( shkura );
        i++;
    }
    GiveGoldToCreature( GetPCSpeaker( ), i*V );
    Gold = Gold + i*V;
    // ТИГР
    }/*
    i = 0;
    object shkura_ = GetObjectByTag( "w_tigr1" );
    while( GetIsObjectValid( shkura_ ) != 0 )
    {
        DestroyObject( shkura_ );
        i++;
    }
    GiveGoldToCreature( GetPCSpeaker( ), i*T );
    Gold = Gold + i*T;
    GiveGoldToCreature( GetPCSpeaker( ), Gold );
}
Lex
Цитата(Белатрис @ Dec 25 2007, 12:51) *
Ну, я имел ввиду операторов

ну тады почему нету? for, while - циклы. Ветвление.. не знаю, что ты имеешь ввиду, но switch есть

Добавлено через 2 минуты 44 секунды

Цитата(Белатрис @ Dec 25 2007, 12:51) *
П.С. И еще. У меня сразу после драки игрок и НПС становятся друзьями и НПС должен начать диалог. Но из-за того, что они только что дрались этого делать нельзя... Как обойти сие ограничение?

как делаешь друзьями? можно очистить личные отношения, перевести в дружественную фракцию, сделать друзьями временно и тд. А потом очистить стек.

Neverwinter Script Source

    while( GetIsObjectValid( shkura ) )
    {
        DestroyObject( shkura );
        i++;
    }

вечный цикл. Нехватает shkura = GetObjectByTag( "w_gray",i ); (или что ты там хотел)
Это к вопросу о "слишком много инструкций". Второй цикл тоже вечный.
gennady
Цитата(Белатрис @ Dec 25 2007, 12:51) *
П.С. И еще. У меня сразу после драки игрок и НПС становятся друзьями и НПС должен начать диалог. Но из-за того, что они только что дрались этого делать нельзя... Как обойти сие ограничение?

Тогда вам поможет скрипт прекращения атаки всех существ в радиусе 30 метров от героя. Учтите, скрипт не меняет фракционных отношений! Если нужно вернуть нормальное отношение фракции, то пропишите это в диалоге, на проверку локалки KONEZ_BOY на НПС, или в скрипте проверки сигнала на невидимом ближайшем объекте с тегом S_BOYA. НПС - носитель скрипта, должен быть бессмертным, чтобы случайным критическим ударом не отправить его на тот свет…
Neverwinter Script Source
//:://////////////////////////////////////////////////
//:: Прекращение атаки
//:: File name: end_attak
//:: Слот: OnDamaged, OnCombatRoundEnd, OnHeartBeat
//:://////////////////////////////////////////////////
void main( )
{
object oPC = GetFirstPC( );
object oSelf = OBJECT_SELF;
object oNPC = GetFirstObjectInShape( SHAPE_SPHERE, 30.0, GetLocation( oPC ), TRUE );

  if ( GetCurrentHitPoints( oSelf ) < 30 && GetLocalInt( oSelf, "KONEZ_BOY" ) != 1 )
  {
  while ( GetIsObjectValid( oNPC ))  // Все существа в радиусе 30 метров
  {
    if( GetIsInCombat( oNPC ) || GetIsEnemy( oPC, oNPC ))
    {
    AssignCommand( oNPC, SurrenderToEnemies( ) );
    AssignCommand( oNPC, ClearAllActions( TRUE ));
    }
    oNPC = GetNextObjectInShape( SHAPE_SPHERE, 30.0, GetLocation( oPC ), TRUE );
  }
  SetLocalInt( oSelf, "KONEZ_BOY", 1 );
  AssignCommand( oPC, ClearAllActions( TRUE ));
  SpeakString( "Я сдаюсь... Прекратим бой!" );
  AssignCommand( oSelf, ActionPlayAnimation( ANIMATION_FIREFORGET_BOW ));
  DelayCommand( 1.5, PlaySound( "as_pl_wailingm2" ));
  int nHeal = GetMaxHitPoints( oSelf ) - GetCurrentHitPoints( oSelf );
  effect eHeal = EffectHeal( nHeal );
  DelayCommand( 100.0, ApplyEffectToObject( DURATION_TYPE_INSTANT, eHeal, oSelf ));
  DelayCommand( 100.0, SetLocalInt( oSelf, "KONEZ_BOY", FALSE ));
  // Дать сигнал
  SignalEvent( GetNearestObjectByTag( "S_BOYA" ), EventUserDefined( 777 ));
  }
}
/*  Все существа в радиусе 30 метров прекращают бой.
  Владелиц скрипта, получает переменную для начала диалога.
  Через 100 сек. снимается эта переменная и лечится персонаж.
  Подается сигнал на ближайший объект с тегом  S_BOYA    */




azathoth
Цитата(Белатрис @ Dec 25 2007, 14:05) *
Я так делал, и знаешь, все равно можно открыть! И без ключа...

Neverwinter Script Source
// The action subject will lock oTarget, which can be a door or a placeable
// object.
void ActionLockObject( object oTarget )
Белатрис
Всем спасибо! thank_you.gif

Цитата
вечный цикл. Нехватает shkura = GetObjectByTag( "w_gray",i ); (или что ты там хотел)
Это к вопросу о "слишком много инструкций". Второй цикл тоже вечный.

Упс... че-т до меня не доперло... Что где не там стоит? помоему я shkura объявил в начале. Или то, что ты написал нужно поставить в цикле?
Lex
Цитата(Белатрис @ Dec 26 2007, 08:37) *
Или то, что ты написал нужно поставить в цикле?

угу. Ибо в цикле ты что делаешь? удаляешь объект shkura постоянно (НЕ переопределяя его. Те удалил его 1 раз, а дальше уже в холостую) и плюсуешь i. Так как удаление само не происходит мгновенно (а если точнее, то само удаление происходит после окончания скрипта) то условие GetIsObjectValid( shkura ) будет всегда правдивым.

Добавлено через 1 минуту 53 секунды

если цель была удалить все объекты с таким тэгом, переопределение shkura надо вносить внутрь цикла сразу после i++; Причем i обязательно должно быть среди параметров задачи shkura
Neverwinter Script Source
GetObjectByTag( "w_gray", i );

иначе ниче не будет.
Белатрис
Neverwinter Script Source
    while( GetIsObjectValid( shkura ))
    {
        DestroyObject( shkura );
        i++;
        object shkura = GetObjectByTag( "w_gray", i );
    }

Я, наверное, неверно понял, т.к. снова много инструкций.. unsure.gif
Lex
тут уже должно быть не "слишком много инструкций", а "омг!! что ж происходит то, епт!". Ибо нельзя под цикл заносить определение переменной.
Neverwinter Script Source

object shkura = GetObjectByTag( "w_gray", i );
while( GetIsObjectValid( shkura ) )
    {
    DestroyObject( shkura );
    i++;
    shkura = GetObjectByTag( "w_gray", i );
    }

найдите 2 отличия, что называется.
gennady
Илья, я бы записал примерно так:
Neverwinter Script Source
void main( )
{
object oPC = GetPCSpeaker( );
object oItem = GetFirstItemInInventory( oPC ); // Первый предмет
int iGold, iTigr, iGray;

  while( GetIsObjectValid( oItem )) // Если существует предмет
  {
    if ( GetTag( oItem ) == "w_gray" ) // ВОЛК
    {iGold+=10; iGray++; DestroyObject( oItem );}
    if ( GetTag( oItem ) == "w_tigr1" ) // ТИГР
    {iGold+=60; iTigr++; DestroyObject( oItem );}
    oItem = GetNextItemInInventory( oPC ); // Следующий предмет
  }

if( iGold > 0 )
{
  GiveGoldToCreature( oPC, iGold );
  if( iGray > 0 ) // Количество шкур Волка
  SendMessageToPC( oPC, "Продано шкур Волка: "+IntToString( iGray ));
  if( iTigr > 0 ) // Количество шкур Тигра
  SendMessageToPC( oPC, "Продано шкур Тигра: "+IntToString( iTigr ));
}
}

P.S. Что будет не понятно спрашивай, и все же почитай про написание циклов…
Лекс, а зачем удалять все шкурки в модуле? biggrin.gif

Lex
Цитата(gennady @ Dec 27 2007, 09:36) *
Лекс, а зачем удалять все шкурки в модуле?

да я тупо не прочитал исходную задачу. Правил только проблемный кусок с зависшим циклом. То что там неправильная работа с инвентарем - я как-то и не заметил. smile.gif


и кстати ты имхо зря целиком пишешь скрипт. Надо проблемные кусочки + подсказки как самому исправлять. А целиком.. nea.gif
Белатрис
Спасибо огромное вам обоим! К сожалению, пришлось воспользоваться скриптом Геннадия, так как мой скрип забирал и шкурки у самого торговца)))) А золото мне давал, кстати)))
Lex
Цитата(Белатрис @ Dec 27 2007, 12:12) *
Спасибо огромное вам обоим! К сожалению, пришлось воспользоваться скриптом Геннадия, так как мой скрип забирал и шкурки у самого торговца)))) А золото мне давал, кстати)))

это потому что кроме проблемы бесконечного цикла у тебя еще куча неточностей была. В следующий раз сделаешь просто ту же ошибку, не более того.
Scrat
Напишите, пожалуйста, скрипт на то, чтобы с появления персонажа он лежал на спине...
Lex
могу подсказать куда копать. Готовый скрипт в принципе тоже могу дать, но толку будет 0: все скрипты для модуля за тебя никто не напишет. нужно осваивать самому или привлекать скриптера.

собсна подсказка: функция ActionPlayAnimation + константа-параметр ANIMATION_***_DEAD_BACK (там под *** FIREFORGET вроде, но я не уверен).
Если под персонажем ты имел ввиду НПС, то добавить получившуюся строку в onSpawn скрипт.
Если персонаж - игрок, то втыкать это надо в onClientEnter в слотах модуля. Но там придется воспользоваться AssignCommand
Edwin
QUOTE
как перевести из int в string? На С++ atoi() и atof()


atof переводила массив чаров в дабл.
atoi переводила массив чаров в инт.

Чтение хедеров фтв.
Белатрис
Цитата(Edwin @ Jan 3 2008, 09:45) *
atof переводила массив чаров в дабл.
atoi переводила массив чаров в инт.

Чтение хедеров фтв.

Это ты к чему? Мне уже давно ответили, а что во что переводит я и так знаю, для примера привел эти два оператора.
Edwin
QUOTE
для примера привел эти два оператора.


Это не операторы, это функции.
Alian REXis
Есть невидимые объекты (creature). Нужно реализовать, чтобы они были видимыми только когда у PC надет определенный айтем (шлем к примеру), при этом всем другим PC они должны оставаться невидимыми. Подскажите как реализовать, если это возможно.
azathoth
шлем с трусиингом?
Alian REXis
Наподобе, но чтобы стандартные заклинания определяющие невидимых не работали на этих существах.
virusman
Цитата(Alian REXis @ Jan 10 2008, 12:40) *
Есть невидимые объекты (creature). Нужно реализовать, чтобы они были видимыми только когда у PC надет определенный айтем (шлем к примеру), при этом всем другим PC они должны оставаться невидимыми. Подскажите как реализовать, если это возможно.
Стандартными средставми NWN именно так, как описано, сделать нельзя. Я недавно сделал Proof of Concept и в скором времени напишу NWNX-плагин для таких вещей (индивидуальное управление видимостью объектов).
Golthana
Добрый вечер. Скажите, пожалуйста, как можно прописать в скрипте, чтобы девастат не убивал, а, например, заберал 80% ХП?
Ответ можно прислать и на мыло: dracul@ukr.net
ZipovUA
Вообщето я не понял, кто такой девостат, но...
почему нельзя просто узнать сколько у персонажа XP и просто присвоить ему на 80% меньше?

типа:

Код
object oPC=GetFirstPC();//работаем з нашим главным персонажем
//або якщо комусь більше подобається, можна написати object oPC=GetEnteringObject();
int XP=0;//инициируем переменную
XP = GetXP(oPC);//вытаскиваем нинищнее значение XP
XP = FloatToInt(XP-XP*0.8); //Выщитываем результат
SetXP(oPC,XP);//Бросаем назад нашему персонажу



Если я правильно понял - то так rolleyes.gif
Lex
1. ХП - Хит Поинты, а не очки опыта. Так что приведенный код малек не туда
2. проблема описанной идеи не в написании кода (это как раз детский сад). А в том, чтобы привязать код к эффекту от девастата. Я не помню как там сделано в НВН1, но вроде бы девастат - фит не активируемый на противнике.. соотв своего скрипта-исполнителя у него нету. Поэтому как решить задачу не через nwnx не знаю (через нвнх тоже не знаю как, но знаю что можно)
Golthana
Возможно вы не поняли суть вопроса, шард имеет лвлкап 25, девастат в чистом виде сильно крут для этого шарда, спасы не соответсвуют, но выключать его полностью - значит сделать дисбаланс в сторону магов, можно ли как-то или понизить дц девастата или сделать чтоб он не убивал, а снимал Х число хитов, либо в процентах?
Lex
Цитата(Golthana @ Feb 14 2008, 02:10) *
Возможно вы не поняли суть вопроса

поняли мы суть вопроса, вы суть ответа не поняли: "У девастата нет скрипта => изменить характер его работы обычными методами нельзя."
denis0k
Вообще вариант есть smile.gif Если на оружие не планируется вешать кастомные OnHit-ы (т.к. движок поддерживает тока 1 на брата), то можно сделать свой девастат.

Получение: кастомные ничего не дающие фиты (просто флаги, подтверждающие взятие девастата)
Включение: на одевание шмотки (OnItemEquip) или даже на ее получение (acquire), если у чара есть фит (см. выше) на оружие, вешать свое OnHit-свойство, которое и будет эмулировать девастат с нужными фиксами. На снятие свойство удаляется. Плюс ведро проверок.

В результате каждое попадание будет запускаться наш скрипт и там уже хоть 80% хп, хоть отрубание головы smile.gif


P.S. Да, я знаю толк в извращениях smile.gif Зато без нвнх.
Ilerien
Цитата
Включение: на одевание шмотки (OnItemEquip) или даже на ее получение (acquire), если у чара есть фит (см. выше) на оружие, вешать свое OnHit-свойство, которое и будет эмулировать девастат с нужными фиксами. На снятие свойство удаляется. Плюс ведро проверок.
А можно проверять, есть ли фит, в самом онхите smile.gif Только придётся руками делать хитрый чек, эмулирующий крит.
Lex
Денисок, а как ты отследишь крит? Любой дамаг выше максимального для данного оружия с бонусами - крит? вроде как нет, да и нагрузка на такие расчеты при каждом ударе..
denis0k
Сразу видно, что я недостаточно играл на эпиках smile.gif Но и тут есть выход smile.gif Следуя уже придуманной извращенной схеме можно самому сделать параллельную проверку крита с учетом диапазона оружия и наличия фитов. Т.е. крит отдельно, девастат (хотя это уже не девастат, а плюшка, отдаленно его напоминающая) отдельно, но шансы их равны.

При провале чека прям сразу вначале скрипта выходим, так что особой нагрузки не будет. Главное тут диапазоны оружий вынести в инклуд, а не грузить каждый раз из 2да, иначе шляпа. Я при слове "нагрузка" всегда вспоминаю аи с его 15к строками в одном из инклудов smile.gif


Громоздко, согласен. Даже кривовато. Но тем не менее реализуется без нвнх. Кстати, как сделать это через нвнх, ума не приложу. Видимо нужен свой плагин, блокирующий работу кода девастата и заодно запускающий вместо него скрипт. Но я такого не видел, поэтому и предложил то, что относительно реально сделать.
Ilerien
Не вариант smile.gif Ты не сможешь нормально посчитать атаку - только приблизительно, не учесть тучу бонусов (например, всякие там против видового разнообразия). Крит подтверждается броском против АС - там тоже проблемно, потому что точный АС ты не рассчитаешь - флетфутед и прочие пакости не дадут.
denis0k
Желание ищет тысячи возможностей, нежелание - тысячи причин smile.gif Или как там оно, не помню.

Мы уже далеко ушли от идеального варианта, значит и тут можем позволить условность - это же не девастат. Атака = баб + абилка + фиты + обкаст + плюшка на оружии (вроде так smile.gif). Ас = GetAC() + проверка консила, посмотреть, что дает этот GetAC() в разных условиях и поправить если что. Насчет необходимости точного АС я бы поспорил, т.к. сам нвн далеко не всегда его верно рассчитывает smile.gif Тот же анкани либо не работает вообще, либо работает через раз. -2 от флет-футед в цифрах эпиков вообще теряется в принципе из-за незначительности.

Можно (и имхо даже нужно) вообще сделать ход конем и придумать свои чеки (как вариант - д20 против диапазона крита, сделав шанс зависимым только от оружия, не забывая, что там еще чек на форту, и именно он является ключевым). Колхоз дело добровольное - хочешь вступай, не хочешь расстреляем. Либо человек несмотря ни на что изголяется и придумывает альтернативу девастату, либо как обычно на шарде будет 2 класса - сорки и все остальные. По мне мотивация довольно значительная.


Т.е. основная идея - совсем отключить девастат и дать какую-то свою плюшку, по мощности ее заменяющую.
azathoth
Продолжая тему извращений...
Neverwinter Script
// The caller will perform a Melee Touch Attack on oTarget
// This is not an action, and it assumes the caller is already within range of
// oTarget
// * Returns 0 on a miss, 1 on a hit and 2 on a critical hit
int TouchAttackMelee(object oTarget, int bDisplayFeedback=TRUE)
Белатрис
Я снова что-то намутил не того...
Neverwinter Script
void main( )
{
    object oSelf = OBJECT_SELF; // Наш НПС
    object wp1 = GetObjectByTag( "p3_1" ); // ТОЧКА У КОСТРА
    object wp2 = GetObjectByTag( "p3_0" ); // ТОЧКА У КОСТРА(СМОТРИТ)
    object wp3 = GetObjectByTag( "p3_2" ); // ТОЧКА В ХРАМЕ
    object wp_center = GetObjectByTag( "pos_center" ); // ТОЧКА, куда смотрят все послушники
    object wp4 = GetObjectByTag( "p3_3" ); // ТОЧКА У ВТОРОГО КОСТРА
    object wp_center_cost = GetObjectByTag( "p3_4" ); // ТОЧКА У ВТОРОГО КОСТРА(СМОТРИТ)
    object wp5 = GetObjectByTag( "p3_5" ); // ИДЁТ СПАТЬ

    int i = GetTimeHour();
    float fTime = 17.0;
    if ( IsInConversation( OBJECT_SELF ))
    { return; }    // Проверим, не болтает ли с игроком...
    if ( GetIsInCombat( OBJECT_SELF )) // Не дерется ли
    {   ExecuteScript( "nw_c2_default1", OBJECT_SELF ); return; }

    if ( i > 0 && i < 10 )
    {   // СПИТ
        if( GetDistanceBetween( oSelf, wp5 ) > 0.2 )
        AssignCommand( oSelf, ActionForceMoveToObject( wp5, FALSE, 1.0, 25.0 ) );
        ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, 36000.0);
    }
    else if(i >= 10 && i < 16)
    {
        // CИДИТ У КОСТРА
        if( GetDistanceBetween( oSelf, wp1 ) > 0.2 )
        ActionDoCommand(AssignCommand( oSelf, ActionForceMoveToObject( wp1, FALSE, 1.0, 25.0 )));
        ActionDoCommand(AssignCommand( oSelf, SetFacingPoint(GetPosition(wp2))));
        ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 21600.0);
        ActionWait(5.0);
        ANIMATION(oSelf);
    }
    else if ( i >= 16 && i < 20 )
    {   // МОЛИТСЯ
        if( GetDistanceBetween( oSelf, wp3 ) > 0.2 )
        AssignCommand( oSelf, ActionForceMoveToObject( wp3, FALSE, 1.0, 25.0 ));
        ActionDoCommand(AssignCommand(oSelf, SetFacingPoint(GetPosition(wp_center))));
        ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 14400.0);
    }
    else if ( i > 20 && i < 23 )
    {   // СНОВА У КОСТРА(ДРУГОГО)
        if( GetDistanceBetween( oSelf, wp4 ) > 0.2 )
        AssignCommand( oSelf, ActionForceMoveToObject( wp4, FALSE, 1.0, 25.0 ) );
        ActionDoCommand(AssignCommand( oSelf, SetFacingPoint(GetPosition(wp_center_cost))));
        ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 14400.0);
        ActionWait(5.0);
        ANIMATION(oSelf);
    }
}

Проблема в том, что НПС не идет на точки и даже не думает этого делать. Только после разговора он(в зависимости от времени) поворачивается к точке(положенной по времени).

П.С. И еще, как заставить его не реагировать на "тыки" по нему мышкой.
П.П.С. Совсем забыл, я пытаюсь наложить эффект на невидимый(и видимый) предмет, но его не видно, только звук при проигровании... =(
Заранее спасибо.
gennady
Намутил как всегда... biggrin.gif
Ты хоть пиши, где этот скрипт применяешь! Опять наверное на ХБ? Пора бы уже знать, что цикл равен 6 секундам, зачем в анимацию совать такое время? Оно же налагается друг на дружку! К тому же не понятна функция ANIMATION(oSelf); Если не можешь время просчитать, то можно перед блоком анимаций чистить акции... + неправильно проставлена проверка расстояния и подход к точке... + поворот сбивает ходьбу. Нужно акцию записать через DelayCommand, а лучше записать так:
Neverwinter Script
if( GetDistanceBetween( oSelf, wp4 ) > 0.2 )
      {
        AssignCommand( oSelf, ActionForceMoveToObject( wp4, FALSE, 0.00, 25.0 ) );
        return;
      }

Белатрис
О, пасиб. Я, если честно, именно от тебя и ждал ответа biggrin.gif

А что с этим:
Цитата
П.С. И еще, как заставить его не реагировать на "тыки" по нему мышкой.
П.П.С. Совсем забыл, я пытаюсь наложить эффект на невидимый(и видимый) предмет, но его не видно, только звук при проигровании... =(


Цитата
К тому же не понятна функция ANIMATION(oSelf);

Я просто не вставил сюда функцию ANIMATION. Но если надо:

Код
void ANIMATION( object oD, float Speed=0.8, float Time=0.0 )
{
int A1;
switch ( Random( 5 )+1 )
  {
   case 1: A1=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD; break;
   case 2: A1=ANIMATION_FIREFORGET_READ; break;
   case 4: A1=ANIMATION_FIREFORGET_DRINK; break;
   case 5: A1=ANIMATION_LOOPING_PAUSE_TIRED; Time=46.0; break;
  }
  if( Time==0.0 )
  AssignCommand( oD, ActionPlayAnimation( A1, Speed ) );
  else
  AssignCommand( oD, ActionPlayAnimation( A1, Speed, Time ) );
}
Белатрис
Как заставить НПС не реагировать на "тыки" по нему мышкой в то время, когда он проигрывает анимацию(или в определенное время)? Это на onUsed?
virusman
OnConversation
Белатрис
Решил создать структуру, общую для всех НПС, но вот только чего-то не выходит так, как нужно...
Neverwinter Script
struct C_NPC
{
        int Circle;     //       * круг магии
        int Weapon;     //       * владени двуручным
        string SpPoint;    //       * точка привязки
};

Neverwinter Script
#include "0c_npc_class"

void main()
{
    C_NPC npc1;
    npc1.Circle = 2;
    npc1.Weapon = 1;
    npc1.SpPoint = "POINT";
}

Ругается на C_NPC npc1;, говорит: НЕТ ТОЧКИ С ЗАПЯТОЙ ПОСЛЕ ВЫРАЖЕНИЯ
snoozer_17.gif

П.С. А почему классы создавать нельзя?
Lex
почитай внимательнее в лексиконе пример о том, как задается структура.
Цитата(Белатрис @ Mar 27 2008, 14:26) *
П.С. А почему классы создавать нельзя?

потому (вопрос, как ты сам понимаешь, не по адресу). По большей части они и не нужны в НВН скриптинге.
virusman
Массивы, хэшсеты + массив глобальных переменных были бы куда полезней. Классы всё равно бы больше лагали, чем приносили пользу.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.