Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Grazzt, Dark Prince
diablo.gif И еще один мааленький вопросец swoon.gif - можно ли манипулировать очередью actions обьектов? Утрировано - NPC по скрипту перемещается к тэгу А, потом к тэгу B, потом к тэгу C. Можно ли каким-то образом выяснить, есть ли к примеру в очереди для этого объекта комманда "переместиться к тэгу B" и очередность её выполнения относительно других комманд очереди? Можно ли каким-то образом "вручную" менять очередность? unsure.gif
Aiwan
Grazzt, Dark Prince зачем такие заморочки. Скрипт то ты сам пишешь. Вот и определись к каждому посту свои условия, к примеру дистанцию или вешавй локалку на НПС. А выуживание акций на кой?
Добавлено в [mergetime]1108395396[/mergetime]
Опиши твою ЗАДАЧУ. Мы подскажем как ее реализовать. А твои домыслы могут быть ужасно не в кассу...
Grazzt, Dark Prince
->Aiwan: Меня интересует сама возможность. dntknw.gif И нужно это мне скорее в целях более эффективной отладки сценариев игры. Понятное дело, что можно послать какой нибудь ClearAllActions, и попробовать сформировать цепочку событий самостоятельно. Но есть один тонкий момент - если цепочку событий для обьекта одновременно формируют несколько различных довольно обьемистых скриптов, то логика работы системы становится достаточно интересной и не всегда до конца предсказуемой в силу довольно таки высокой сложности этой самой логики и недостатка времени на бетатестирование. Как правило приходится довольно страшно изголяться с очисткой буфера комманд и локальными переменными, что не всегда (ну во всяком случае из моей скудной практики программирования под Аврору) есть гуд. Конечно можно сказать, что надо по возможности избегать таких моментов. Но увы и ах - не всегда это удается. И тогда наступают муки адовы, выражающиеся в длительных попытках найти логическую ошибку в собственных скриптах не имея нормальных средств отладки. Разобраться в этом помогло бы что-то вроде лога всех скриптовых комманд с результатами отработки, посланных во время игрового процесса. Но увы - этого видимо нет (а было бы удобно...). По этому на худой конец подошли бы и некие функции получения мгновенного состояния буфера комманд. Это был бы просто луч света в темном царстве. drag.gif
Archangel
Здрастеся все.
У меня тут небольшой косяк, помогите пжАААлуйста: swoon.gif swoon.gif

Neverwinter Script Source
void main()
{
object oGuard =GetObjectByTag("Guard_1");
object oMech = GetObjectByTag("Mech");
while (GetTag(oItem)!=sTag)
{
object oItem = GetNextItemInInventory(oMech);
if (!GetIsObjectValid(oItem)) return OBJECT_INVALID;
  }
return oItem;
}
int nInventorySlot = GetInventoryDisturbItem(oMech);


// Здесь должна быть эта долбаная проверка this.gif



ActionEquipItem(GetItem("Mech",OBJECT_SELF),INVENTORY_SLOT_RIGHTHAND);
SetLocalInt(OBJECT_SELF,"Mech",FALSE);
}


Этот скрипт вствляется в OnDamage(или как его там, непомню. Вообщем мысля понятна)НеПиСя.
И когда НеПиСь получает повреждение(т.е. его атакуют), то он должен достать меч.
В принципе все получается, но я не знаю как сделать проверку на, то, что НеПиСя атакуют.
Помогите.Плизззззз! mamba.gif

P.S.: КУДА ВСЕ РАЗБЕЖАЛИСЬ?
Aiwan
QUOTE
Меня интересует сама возможность.

Скорее всего нет.
QUOTE
И нужно это мне скорее в целях более эффективной отладки сценариев игры. Понятное дело, что можно послать какой нибудь ClearAllActions, и попробовать сформировать цепочку событий самостоятельно.

Извини, но твои запросы непонятны с точки зрения необходимости. Зачем выуживать то что там накопилось? И пытаться разобраться? ТЫ что, будешь сам ковырять стэк? Или доверишься СКРИПТУ? По твоей логике, ты делаешь подсластитель сахару. Ты и отличаешься от компьютера, что можешь сам задать логику своих скриптов и прочее. И вообще, ОПИШИ хоть ОДНУ ситуацию, когда тебе это действительно НАДО. В стэк помещается 75 акций. Ты получил 50 разных. Что делаешь? biggrin.gif Все что ты описал это не аргумент, это сожаления неумелого скриптера. Когда ты научишься писать скрипты хорошо, твой вопрос будет снят сам собой. Как что то в модуле работает без твоего ведома??? Я не пойму ты тогда зачем там? biggrin.gif
Давай конкретную ситуацию. Ты делаешь то то, а происходит то-то и ты не знаешь почему. И поговорим.

QUOTE
P.S.: КУДА ВСЕ РАЗБЕЖАЛИСЬ?

Мы тут сидим от нечего делать и правим всем скрипты. Все остальное для нас пустой звук в мире. dirol.gif
О! Ну наконец я могу помочь страждущему! superman.gif
Поставь это на ОнДамадж НПС.
Neverwinter Script Source
void main()
{
object oItem = GetItemPossessedBy(OBJECT_SELF, "Mech");
ActionEquipItem(oItem, OBJECT_SELF, INVENTORY_SLOT_RIGHTHAND);
}

Archangel
QUOTE
Мы тут сидим от нечего делать и правим всем скрипты. Все остальное для нас пустой звук в мире.


Да, ладно Aiwan...
Это я ж так, шуча.....

А за скрипт спасибушки!
wacko.gif wacko.gif wacko.gif
Добавлено в [mergetime]1108460998[/mergetime]
Aiwan!
Че-то твой скрипт не фурычит!
Я,конечно, мало че в этом понимаю, но вроде бы тута еще переменная нужна......
Пытался сам енто исправить, но не получилось. Ибо мозгов не хватает.

P.s.: Не компилится во 2й строчке. ph34r.gif ph34r.gif ph34r.gif
dumbo
Archangel
я конечно не уверен, бо не проверял, но есть подозрение,
что при каждом попадании по NPC он будет делать доставание меча,
что, имхо, негативно скажется на его боеспособности...

правильнее, наверное, так:
Neverwinter Script Source
void main()
{
  object oSword = GetItemPossessedBy(OBJECT_SELF, "Mech");
  object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND);
  if (oItem != oSword)
    AssignCommand(OBJECT_SELF, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND));
}


кстати, Archangel знаком с такой штукой - лексикон?

ps. по поводу "доставания меча" - во времена "игры запоем" обнаружил такую штуку:
если во время боя постоянно менять "набор оружия", процент попадания сильно
увеличивается... это, конечно, субъективно, но так показалось. dntknw.gif
DBColl
dumbo
AssignCommand(OBJECT_SELF, ...) - это бессмысленная строка. Достаточно просто
ClearAllActions();
ActionEquipItem(...);
DetermineCombatRound(...);
dumbo
DBColl
каюсь. AssignCommand применительно к селфу - лишнее стопудово yes.gif
взял из первого попавшегося скрипта, особо не раздумывая... а надо было.
Grazzt, Dark Prince
>Aiwan: Немного флуда (непреднамереного) и вопрос. diablo.gif
Необходимость простая - отладка. Другой нет (пока). Ничего предосудительного в том, чтобы если уж существует буфер акций, то иметь возможность полноценной работы с ним, я не вижу (можно отнести к разделу моих пожеланий по второму NWN biggrin.gif ). Ну впрочем вчера я и без этого разобрался. Проблема была в синхронизации действий "босса" и его "подручных" во время боя с PC и была связана с несколько некорректным планированием боевой ситуации с моей стороны. Нужно было точно синхронизировать работу трех скриптов, в одном из которых была ветка, завязяная на здоровье "босса". Из-за разности наносимого демеджа в конкретный момент времени в различных тестовых боях в некоторых случаях возникало рассогласование действий актеров. И в результате получалось тоже неплохо, но не так, как я хотел (в основном из-за не вовремя посланных DelayCommand). Решилось все просто изменением значения двух локальных переменных. Чисто (на мой непросвященный взгляд) логическая ошибка, на которую я угробил 8,5 часов своего драгоценного времени и чего бы не было, знай я содержимое буфера. А так пришлось сендить все имеющиеся переменные и долго и упорно ловить мелкий(?!) но гадский глюк. На счет опытности ты прав - на Авроре я програмлю всего неделю, по этому скрипты у меня вероятно еще не очень хорошие biggrin.gif Впрочем ничего особенного в Авроре нет кроме массы нюансов (а в них вся соль!), которых о которых я еще (пока!) не знаю. Например (это уже вопрос!) 75 акций - это для всех обьектов или для одного?
Aiwan
QUOTE (dumbo @ Feb 15 2005, 16:21)
я конечно не уверен, бо не проверял, но есть подозрение,
что при каждом попадании по NPC он будет делать доставание меча,
что, имхо, негативно скажется на его боеспособности...

Да, ты прав, я невнимательно написал и кстати без ароры, что естественно мог ошибиться в синтаксисе...
QUOTE (Grazzt @ Dark Prince, Feb 15 2005, 18:25)
Например (это уже вопрос!) 75 акций - это для всех обьектов или для одного?

У каждого объекта есть стек команд, он вмещает 75 акций.
QUOTE (Grazzt @ Dark Prince, Feb 15 2005, 18:25)
А так пришлось сендить все имеющиеся переменные и долго и упорно ловить мелкий(?!) но гадский глюк.

Давай поговорим через год. Тогда ты скажешь, нужна эта функция для доставания акций из стэка или нет. За два с лишним года ты первый кто об этом заикается. Но скажу так, никакие функции не заменят кривых скриптов. Мне интересно, как ты собрался десять акций идти по вейпам узнавать из какого скрипта какая акция? Ты хочешь еще кнопочку еррорлог, и тебе пишет тулсет где какую запятую тебе поставить, мол вы ошиблись. smile.gif Учись скриптить и не морочь нам голову. К тому же, ты разбираешься в них неплохо для новичка. Так что скоро будешь смеяться над своим предложением.
DBColl
QUOTE (Grazzt @ Dark Prince, Feb 15 2005, 14:25)
Например (это уже вопрос!) 75 акций - это для всех обьектов или для одного?

Для КАЖДОГО объекта.

А иметь возможность просматривать стек акций было бы действительно неплохо... yes.gif
Aiwan
QUOTE (DBColl @ Feb 15 2005, 20:22)
А иметь возможность просматривать стек акций было бы действительно неплохо...

Согласен. Но не сделает Биовар это вам. Обсидан тоесть... Скажут учите Лексикон.
MasterMage
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Created By: MasterMage ©
//:: Created On: edit 15.02.05
//::///////////////////////////////////////////////
void main()
{
    object oPC=GetPCItemLastUnequippedBy();
    object oRing=GetPCItemLastUnequipped();

    if (GetTag(oRing)=="Ring")
    {
    effect eEf=GetFirstEffect(oPC);
    while (GetIsEffectValid(eEf))
    {
    RemoveEffect(oPC,eEf);
    eEf=GetNextEffect(oPC);
    }
    }
    return;
}
это уменьшенная копия второго, но тут дело так, что все эффекты могут удалиться...Вот...
Grazzt, Dark Prince
[SIZE=1]
QUOTE (Aiwan @ Feb 15 2005, 17:54)
Согласен. Но  не сделает Биовар это вам. Обсидан тоесть... Скажут учите Лексикон.

biggrin.gif Ну ведь есть раздел пожеланий. Наверно если хорошенько пожелать lol.gif , да еще кто-то не поленится перевести... biggrin.gif Так и вертится цитата:
"...Ибо Писание говорит фараону: для того самого Я и поставил тебя, чтобы показать над тобою силу Мою и чтобы проповедано было имя Мое по всей земле... "
Послание св. Павла к римлянам.
diablo.gif
MasterMage
Grazzt, Dark Prince wizard.gif
ЭХ......мыслители..... Ээээээээх...
Aiwan СМОТРИ, СМОТРИ СЮДА!!!! clapping.gif
Вот смотри... решил сделать скрипт, как вещи Нашера...Там где статы прибавлябтся, если все собрал... Но не понял особо инклуды и готовые, поэтому написал свой...
Neverwinter Script Source
void main()
{
    object oPC=GetPCItemLastEquippedBy();
    object oItem1=GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
    object oItem2=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
    object oItem3=GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
    object oItem4=GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
    if(GetTag(oItem1)=="Item1"&&
    GetTag(oItem2)=="Item2"&&
    GetTag(oItem3)=="Item3"&&
    GetTag(oItem4)=="Item4"&&GetLocalInt(oPC,"Veshi")==0)
    {
    SetLocalInt(oPC,"Veshi",1);
    SetLocalInt(oPC,"i1",GetAbilityScore(oPC,ABILITY_STRENGTH));
    SetLocalInt(oPC,"i2",GetAbilityScore(oPC,ABILITY_DEXTERITY));
    SetLocalInt(oPC,"i3",GetAbilityScore(oPC,ABILITY_CONSTITUTION));
    SetLocalInt(oPC,"i4",GetAbilityScore(oPC,ABILITY_WISDOM));
    effect eEf1=EffectAbilityIncrease(ABILITY_STRENGTH,10);
    effect eEf2=EffectAbilityIncrease(ABILITY_DEXTERITY,10);
    effect eEf3=EffectAbilityIncrease(ABILITY_CONSTITUTION,10);
    effect eEf4=EffectAbilityIncrease(ABILITY_WISDOM,10);
    effect eEf_main=EffectVisualEffect(VFX_DUR_STONEHOLD);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf1,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf2,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf3,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf4,oPC);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEf_main,oPC,1.5);
    }
    return;

}
это когда одел


Neverwinter Script Source
void main()
{
    object oPC=GetPCItemLastUnequippedBy();
    object oItem=GetPCItemLastUnequipped();
    int i1=(GetAbilityScore(oPC,ABILITY_STRENGTH) - GetLocalInt(oPC,"i1"));
    int i2=(GetAbilityScore(oPC,ABILITY_DEXTERITY) - GetLocalInt(oPC,"i2"));
    int i3=(GetAbilityScore(oPC,ABILITY_CONSTITUTION) - GetLocalInt(oPC,"i3"));
    int i4=(GetAbilityScore(oPC,ABILITY_WISDOM) - GetLocalInt(oPC,"i4"));
    if(GetTag(oItem)=="Item1"||
    GetTag(oItem)=="Item2" ||
    GetTag(oItem)=="Item3" ||
    GetTag(oItem)=="Item4" )
    {
    SetLocalInt(oPC,"Veshi",0);
    effect eEf1=EffectAbilityDecrease(ABILITY_STRENGTH,i1);
    effect eEf2=EffectAbilityDecrease(ABILITY_DEXTERITY,i2);
    effect eEf3=EffectAbilityDecrease(ABILITY_CONSTITUTION,i3);
    effect eEf4=EffectAbilityDecrease(ABILITY_WISDOM,i4);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf1,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf2,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf3,oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEf4,oPC);

    }

}
это когда снял, но иконки эффекта не исчезают.... есть что-нить полегче, да и заодно подскажи, как полегче сделать.... Не зря ученик у учителю обращается... this.gif
dumbo
MasterMage
тебе надо делать не EffectAbilityDecrease, а цикл по уже наложенным эффектам на перса, выуживать наложенные тобой, и их снимать. А так ты вешаешь допольнительные новые эффекты на снимании...
Lex
QUOTE (Archangel @ Feb 13 2005, 17:46)
Есть Игрок, он пытается открыть дверь(точнее взломать-сначало дверь закрыта). Если у него енто получается, то рядом стоящий охранник говорит:"I kill you small thief!"

слот onUnLock
Neverwinter Script Source
void main()
{
object oGuard = GetNearestObjectByTag("Guard_dragons_1");
object oPC = GetLastUnlocked();
if (!GetIsPC(oPC)) return;
AssignCommand(oGuard,ClearAllActions());
AssignCommand(oGuard,ActionAttack(oPC));
AssignCommand(oGuard,SpeakString("I kill you small thief!"));
}

В случае, если РС успешно взломал дверь, то стражник нападает. Как тебе вроде и надо.

QUOTE (Archangel @ Feb 13 2005, 17:46)
Если ж у Игрока не получается тпереть дверь, то тогда охранник просто говорит: "What are you doing? Get out small thief!".

это нельзя сделать именно так. Можно что игрок пытается открыть дверь, но не может.
слот onFailToOpen
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
if (!GetIsPC(oPC)) return;
object oGuard = GetNearestObjectByTag("Guard_dragons_1");
AssignCommand(oGuard,SpeakString("What are you doing? Get out small thief!"));
}


Проверил, все работает
Aiwan
MasterMage я такие скрипты не писал. Спроси ДБа или Лекса. rolleyes.gif
Lex
QUOTE (dumbo @ Feb 15 2005, 19:36)
MasterMage тебе надо делать не EffectAbilityDecrease, а цикл по уже наложенным эффектам на перса, выуживать наложенные тобой, и их снимать. А так ты вешаешь допольнительные новые эффекты на сниман

абсолютно верно.
Neverwinter Script Source
void main()
{
    object oPC=GetPCItemLastUnequippedBy();
    object oItem=GetPCItemLastUnequipped();
    if(GetTag(oItem)=="Item1"||
    GetTag(oItem)=="Item2" ||
    GetTag(oItem)=="Item3" ||
    GetTag(oItem)=="Item4" )
    {
       if (GetLocalInt(oPC,"Veshi")==0) return;
       SetLocalInt(oPC,"Veshi",0);
       effect ePCEffect = GetFirstEffect(oPC);
       effect eEf1=EffectAbilityIncrease(ABILITY_STRENGTH,10);
       effect eEf2=EffectAbilityIncrease(ABILITY_DEXTERITY,10);
       effect eEf3=EffectAbilityIncrease(ABILITY_CONSTITUTION,10);
       effect eEf4=EffectAbilityIncrease(ABILITY_WISDOM,10);
      while (GetIsEffectValid(ePCEffect))
       {
          if ((ePCEffect==eEf1)||(ePCEffect==eEf2)||(ePCEffect==eEf3)||(ePCEffect==eEf4))
               RemoveEffect(oPC,ePCEffect);
          ePCEffect = GetNextEffect(oPC);
       }    
    }
}


Вроде так
Как видишь, локалки не нужны. Так что первый скрипт можно упростить


QUOTE (Grazzt @ Dark Prince, Feb 14 2005, 17:22)
Можно ли каким-то образом выяснить, есть ли к примеру в очереди для этого объекта комманда "переместиться к тэгу B" и очередность её выполнения относительно других комманд очереди? Можно ли каким-то образом "вручную" менять очередность?

нет.
Можно добиться такого эффекта другим методом, но копаться в стеке акций нельзя.


QUOTE (Archangel @ Feb 14 2005, 21:18)
В принципе все получается, но я не знаю как сделать проверку на, то, что НеПиСя атакуют.

если он получил Дамаг, значит его атакуют. проверка не нужна.

QUOTE (Aiwan @ Feb 15 2005, 17:17)
Ты хочешь еще кнопочку еррорлог, и тебе пишет тулсет где какую запятую тебе поставить, мол вы ошиблись.Учись скриптить и не морочь нам голову.

Не кипятись. biggrin.gif
dumbo
боюсь, что и Lex не попал... прилагаю официальную спраУку:
QUOTE

Remarks
A common mistake with this function is to use the following approach to remove, say, a sleep effect:
effect eSleep=EffectSleep();
RemoveEffect(oPC, eSleep);
This doesn't work, because calling EffectSleep creates a new effect. It is thus not the sleep effect that is currently on oPC, but a different sleep effect.


так что тут должно быть примерно такое:
Neverwinter Script Source
void main()
{
    object oPC=GetPCItemLastUnequippedBy();
    object oItem=GetPCItemLastUnequipped();
    if(GetTag(oItem)=="Item1"||
    GetTag(oItem)=="Item2" ||
    GetTag(oItem)=="Item3" ||
    GetTag(oItem)=="Item4" )
    {
      if (GetLocalInt(oPC,"Veshi")==0) return;
      SetLocalInt(oPC,"Veshi",0);
      effect ePCEffect = GetFirstEffect(oPC);
      while (GetIsEffectValid(ePCEffect))
      {
          if((GetEffectType(ePCEffect) == EFFECT_TYPE_ABILITY_INCREASE) &&
            ((GetEffectCreator(ePCEffect) == GetModule()))
              RemoveEffect(oPC, ePCEffect);
          ePCEffect = GetNextEffect(oPC);
      }   
    }
}


дабы не сымать "чужие" эффекты, стоит проверочка на создателя...
если я правильно помню, то этим не обойдешься, если хочешь,
чтоб все ровно было - после реста эти эффекты "улетают"... swoon.gif
Lex
Хехе, нет, dumbo, тут я все попал. smile.gif

CODE

effect eSleep=EffectSleep();
RemoveEffect(oPC, eSleep);
This doesn't work...

но я то что удаляю?
CODE

ePCEffect = GetNextEffect(oPC);
RemoveEffect(oPC,ePCEffect);

Проверку на креатора можно внести в мой вариант, но просто подъем стата на 10 пунктов вещь довольно редкая.


Но твой вариант тоже верен. За одним НО
- снимутся все эффекты повышения статов, наложенных модулем. А это могут быть эффекты от других вещей. (например зелье ловкости. Хотя тут я не уверен, что эффект накладывает модуль, надо попробовать.)

Я уже сталкивался с подобными делами. У себя я демал моим вариантом + проверял креатора. Чтобы уж наверняка. (креатором был НПС Effector, что стоял у меня в закрытой локации. )
dumbo
Lex
эх, спорить буду. tomato.gif
спраУку я привел немного не для того... а для чего - сейчас поймешь. drag.gif
удаляешь ты тот что нужно эфект, перечисляемый. да. но!
обрати внимание с чем ты его сравниваешь. вот где порылась собака,
описываемая в нотайсе. ты сравниваешь эффект созданный (давноpardon.gif в OnEquip
с только что созданным новым эффектом. даже если эту конструкцию
пропустит компилер, в чем я сомневаюсь, равны они никак и никогда не будут.

спецовый НПС-зэк - стопудовый хит в деле создания скриптов... good.gif
это я упустил. а зря.
Shad
QUOTE (Friedrich @ Feb 13 2005, 20:23)
QUOTE
И еще вопросик как мне соединить в скрипте на локации 4 заклинания Луч Мороза
Например 4 Точки маршрута и из 1 точки бьёт луч во 2 и т.д

На вейпоинты, по-моему, вообще ничего накладывать нельзя. На не статичные невидимые плейсаблы - можно.

Точно. И на локацию луч тож наложить нельзя. То все что я выше написал - неподходит. Подходит вот что:
1. Расставляем вейпойнты с тегами от имя0 до имяN, invisobj001 - ResRef невидимого _нестатического_ объекта (_статичекий_ невидимый лежит в Placeable Objects/Miscellaneous), этот скрипт вешаем на НПС:
Neverwinter Script Source
void main()
{
    int i = 0;
    string sWPTag = "имя";
    object oSource;
    object oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "invisobj001",
                    GetLocation(GetWaypointByTag(sWPTag+"0")),
                    0, "IO"+sWPTag+"0");
    //First temporary target object created
    ClearAllActions();
    ActionCastSpellAtObject(SPELL_RAY_OF_FROST, oTarget, METAMAGIC_ANY, 1);
    //NPC shoots first ray
    DestroyObject(oTarget, 7.0);
    //Temporary invisible target will be destroyed. Place here how long show must go on
    while(GetIsObjectValid(GetWaypointByTag(sWPTag+IntToString(++i))))//Validate next waypoint
    {
        oSource = oTarget;//Choose next source
        oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "invisobj001",
                  GetLocation(GetWaypointByTag(sWPTag+IntToString(i))),
                  0, "IO"+sWPTag+IntToString(i));
        //Create next temporary target object
        DelayCommand(2.0+0.2*i, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oSource, BODY_NODE_CHEST), oTarget, 30.0));
        //Delayed appliance of ray effect. Show time really maintained by destroying source/target object
        DestroyObject(oTarget, 7.0);//Destroy temporary object. Place here how long show must go on
    }
    DelayCommand(2.0+0.2*i, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oTarget, BODY_NODE_CHEST), GetObjectByTag("IO"+sWPTag+"0"), 30.0));
    //Close polygon
}

2. Расставляем невидимые нестатические с тегами от Тег0 до ТегN, вешаем скрипт на НПС:
Neverwinter Script Source
void main()
{
    int i = 0;
    string sIOTag = "Тег";
    object oSource;
    object oTarget = GetObjectByTag(sIOTag+"0");
    //First target object chosen
    ClearAllActions();
    ActionCastSpellAtObject(SPELL_RAY_OF_FROST, oTarget, METAMAGIC_ANY, 1);//NPC shoots first ray
    while(GetIsObjectValid(GetObjectByTag(sIOTag+IntToString(++i))))//Validate next waypoint
    {
        oSource = oTarget;//Choose next source
        oTarget = GetObjectByTag(sIOTag+IntToString(i));
        //Choose next target object
        DelayCommand(2.0+0.2*i, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oSource, BODY_NODE_CHEST), oTarget, 5.0-0.2*i));
        //Delayed appliance of ray effect. Replace 5.0 with needed show time
    }
    DelayCommand(2.0+0.2*i, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oTarget, BODY_NODE_CHEST), GetObjectByTag(sIOTag+"0"), 5.0-0.2*i));
    //Close polygon. Replace 5.0 with needed show time
}


Приимущество первого - красиво постепенно исчезает єффект, приимущество второго - проще.
Nokoll
Shad
Спасибо Дома Попробую, сделать. wink.gif
Добавлено в [mergetime]1108541889[/mergetime]
Я непонел как это сделать Расставляем вейпойнты с тегами от имя0 до имяN, invisobj001 - ResRef невидимого _нестатического_ объекта (_статичекий_ невидимый лежит в Placeable Objects/Miscellaneous), этот скрипт вешаем на НПС:. и на кокой слот у НПК ставить.
Я Придумал свою версию скрипта как думаеш норма!
Делается 5 НЕВИДИМЫХ НПК ПРИСВАЕВАИМ им номера и теги и вперёд..

Neverwinter Script Source
void main()
{
        int nNumber = StringToInt(GetStringRight(GetTag(OBJECT_SELF),1));
        //determines target of the lightning
        if (nNumber == 5)
        {
            nNumber = 1;
        }
        else
        {
            nNumber++;
        }
        object oTarget = GetNearestObjectByTag("Nev_Npc" + IntToString(nNumber));
        if(GetIsObjectValid(oTarget))
        {
            DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectBeam(VFX_BEAM_COLD,OBJECT_SELF,BODY_NODE_CHEST),oTarget));
        }

}


его ещё не проверял хочу посаветывотся. good.gif

DBColl
Neverwinter Script Source
       effect ePCEffect = GetFirstEffect(oPC);
       effect eEf1=EffectAbilityIncrease(ABILITY_STRENGTH,10);
       effect eEf2=EffectAbilityIncrease(ABILITY_DEXTERITY,10);
       effect eEf3=EffectAbilityIncrease(ABILITY_CONSTITUTION,10);
       effect eEf4=EffectAbilityIncrease(ABILITY_WISDOM,10);
      while (GetIsEffectValid(ePCEffect))
       {
          if ((ePCEffect==eEf1)||(ePCEffect==eEf2)||(ePCEffect==eEf3)||(ePCEffect==eEf4))
               RemoveEffect(oPC,ePCEffect);
          ePCEffect = GetNextEffect(oPC);
       }

Лекс, честно говоря, я согласен с Дамбо и сомневаюсь, что такая схема сработает. Компилятор-то ее схавает, а вот работать она будет неверно. То, что привел Дамбо - есть действительно правильный вариант.
Neverwinter Script Source
      effect ePCEffect = GetFirstEffect(oPC);
      while (GetIsEffectValid(ePCEffect))
      {
          if((GetEffectType(ePCEffect) == EFFECT_TYPE_ABILITY_INCREASE) &&
            ((GetEffectCreator(ePCEffect) == GetModule()))
              RemoveEffect(oPC, ePCEffect);
          ePCEffect = GetNextEffect(oPC);
      }

Только объект Модуля все же мне кажется не стоит проверять, как креатора. Креатором эффекта от Зелий является тот, кто пьет это зелье. По сути он применяет эффект на самого себя. Это как обкаст OBJECT_SELF.
dumbo
запустил-таки я этот гадский(потому что тормознооой) тулсет... bad.gif
в конструкции Lex'a типа ePCEffect==eEf1, которая почему-то навеяла на меня сомнения(которые, впрочем, через некоторое время после нажатия кнопки "Отправить", рассеялись. просто редактировать посты - не моеwink.gif относительно компилябельности, с этой точки зрения ничего предосудительного нет.

итак - краткое руководство по созданию "набора нашера": drag.gif

1. на OnPlayerEquipItem вешаем:
Neverwinter Script Source
void main()
{
  object oPC = GetPCItemLastEquippedBy();
  object oItem1=GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
  object oItem2=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
  object oItem3=GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
  object oItem4=GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
  if(GetTag(oItem1)=="Item1"&&
    GetTag(oItem2)=="Item2"&&
    GetTag(oItem3)=="Item3"&&
    GetTag(oItem4)=="Item4"&&GetLocalInt(oPC,"Veshi")==0)
  {
    SetLocalInt(oPC,"Veshi",1);
    object oNasher = GetObjectByTag("Nasher");
    SetLocalObject(oNasher, "Veshi_owner", oPC);
    event eSpecialEvent = EventUserDefined(2222);
    SignalEvent(oNasher,eSpecialEvent);
  }
  return;
}


2. на OnPlayerUnEquipItem такое:
Neverwinter Script Source
void main()
{
  object oPC=GetPCItemLastUnequippedBy();
  object oItem=GetPCItemLastUnequipped();
  if(GetTag(oItem)=="Item1"||
    GetTag(oItem)=="Item2" ||
    GetTag(oItem)=="Item3" ||
    GetTag(oItem)=="Item4" )
  {
    if (GetLocalInt(oPC,"Veshi")==0) return;
    SetLocalInt(oPC,"Veshi",0);
    effect ePCEffect = GetFirstEffect(oPC);
    while(GetIsEffectValid(ePCEffect))
    {
      if((GetEffectType(ePCEffect) == EFFECT_TYPE_ABILITY_INCREASE) &&
        (GetEffectCreator(ePCEffect)==GetObjectByTag("Nasher")))
        RemoveEffect(oPC, ePCEffect);
      ePCEffect = GetNextEffect(oPC);
    }
  }
}


3. создаем товарища "Nasher Adio" с тэгом Nasher и
в OnUserDefined ему вешаем такое:
Neverwinter Script Source
void main()
{
  object oPC = GetLocalObject(OBJECT_SELF, "Veshi_owner");
  if (!GetIsPC(oPC)) return;
  if (GetUserDefinedEventNumber()==2222)
  {
    SpeakString("Ну ты молодец, в натуре!", TALKVOLUME_SHOUT);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,
      EffectAbilityIncrease(ABILITY_STRENGTH,10),oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,
      EffectAbilityIncrease(ABILITY_DEXTERITY,10),oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,
      EffectAbilityIncrease(ABILITY_CONSTITUTION,10),oPC);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,
      EffectAbilityIncrease(ABILITY_WISDOM,10),oPC);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
      EffectVisualEffect(VFX_DUR_STONEHOLD),oPC,1.5);
  }
  DeleteLocalObject(OBJECT_SELF, "Veshi_owner");
}


note: после сна эффекты снимутся. надо будет перенадевать шмотку.
2lazy... drag.gif
MasterMage
dumbo Lex
пасибо...Туго у меня с while, но с остальным понял....Просто не знал как через уайл задать, чтоб не убирались все эййекты....
И кстати....Помнится с Дб говорили...
Remove убирает только эффекты с одного скрипта...В одном теле....
Обидно black eye.gif
dumbo
MasterMage, не понял тебя.
какие "эффекты с одного скрипта"? какие тела? swoon.gif
Remove убирает то, что ему говорят, независимо от того, откуда это взялось.
•Immortal•
Нужен скрипт чтобы непись давал плееру 10 лямов при базаре, просто я сам никрена в скриптах не лазею...
Tiger Greyhawk
QUOTE (•Immortal• @ Feb 16 2005, 21:51)
Нужен скрипт чтобы непись давал плееру 10 лямов при базаре, просто я сам никрена в скриптах не лазею...

На ветке диалога, где нужно дать "10 лямов", переходишь на вкладку Action Taken (Совершены действия). Это справа внизу. Там нажимаешь на кнопку с иконкой красной шляпы. Далее разберешься.
Либо, если хочешь готовый, то:
Neverwinter Script Source
void main()
{
GiveGoldToCreature(GetPCSpeaker(), 1000000);
}

Пока не особо разбираешься в скриптах, юзай wizard`а (красная шляпка) и обязательно качай учебник Aiwan`а. Для новичка, ИМХО, самое лучшее. + даже если плохо знаешь англ, все равно используй lexicon. Там достаточно просто со словарем разобраться. + в редакторе скриптов, справа вверху есть фильтр. Большинство функций имеют в своем теле англ. слова. Обрати внимание на функцию выше. ДатьЗолотоСозданию. Соответсвенно в фильтре ты можешь ввести gold, и он тебе выдаст все функции, которые содержат этот набор букв (здесь gold), а это почти тоже самое, что и работают с этим набором букв (здесь золотом).
Shad
QUOTE (Nokoll @ Feb 16 2005, 10:51)
Shad
Спасибо Дома Попробую, сделать. wink.gif 
<small>Добавлено в 11:18</small>
Я непонел как это сделать Расставляем вейпойнты с тегами от имя0 до имяN, invisobj001 - ResRef невидимого _нестатического_ объекта (_статичекий_ невидимый лежит в Placeable Objects/Miscellaneous), этот скрипт вешаем на НПС:. и на кокой слот у НПК ставить.

Именя вейпойнтов например WP_NAME1,WP_NAME2,WP_NAME3,WP_NAME4..., тогда WP_NAME это имя, его вписываем в скрипт в строке
Neverwinter Script Source
string sWPTag = "имя";
Количество вейпойнтов неограничено.
Потом создаёшь из Placeable Objects/Miscellaneous/Invisible Object копию, снимая флаг Static (Useable ставить необязательно), ResRef получившегося объекта вставляем в скрипт вместо invisobj001.
Скрипт вешаем NPC на Action Taken в диалоге.
QUOTE (Nokoll @ Feb 16 2005, 10:51)

Я Придумал свою версию скрипта как думаеш норма!
Делается 5 НЕВИДИМЫХ НПК ПРИСВАЕВАИМ им номера и теги и вперёд..

Neverwinter Script Source
void main()
{
        int nNumber = StringToInt(GetStringRight(GetTag(OBJECT_SELF),1));
        //determines target of the lightning
        if (nNumber == 5)
        {
            nNumber = 1;
        }
        else
        {
            nNumber++;
        }
        object oTarget = GetNearestObjectByTag("Nev_Npc" + IntToString(nNumber));
        if(GetIsObjectValid(oTarget))
        {
            DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oTarget));
        }

}


его ещё не проверял хочу посаветывотся. good.gif


Можно и так, но тогда чётко ограничено количество узлов, и чтобы это хотябы заработало надо добавить пару строчек так:

Neverwinter Script Source
void main()
{
    int nNumber = StringToInt(GetStringRight(GetTag(OBJECT_SELF),1));
    //determines target of the lightning
    if (nNumber == 5)
    {
      nNumber = 1;
    }
    else
    {
      nNumber++;
    }
    object oTarget = GetNearestObjectByTag("Nev_Npc" + IntToString(nNumber));
    if(GetIsObjectValid(oTarget))
    {
       DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oTarget));
    }
    int i = GetLocalInt(OBJECT_SELF, "RAYCHi");
    if (i++<5)
    {
        SetLocalInt(oTarget, "RAYCHi", i);
        DelayCommand(2.0, ExecuteScript("s3", oTarget));
        //Replace s3 here with your script name
    }
}

, а первому НПС повесить локальную переменную RAYCHi типа int значением 1.
MasterMage
dumbo
смотри
В одном скрипте создал еффект, это раз
В другом ты хочешь его убрать RemoveEffect (oPC,eEf);, но он не уберет, так как не находит
Но если в скрипте
(смотри мой ролик в "Построение скриптовых сцен")
Добавлено в [mergetime]1108621226[/mergetime]
сначала создал, а потом убираешь, то убирается
Лито
Такой вопрос. Есть голем страж, который реагирует на слово произносимое игроком. Это я смог сделать(спасибо Авадону, написавший скрипт для банка smile.gif )
Но как сделать чтобы на любое другое слово, голем произносил, например...."неверно"?

Вот скрипт который я уже написал:
OnSpawn
Neverwinter Script Source
void main()
{
object oPC = GetLastSpeaker();
SetListening(OBJECT_SELF, 1);
SetListenPattern(OBJECT_SELF,"бубен",1);
}


OnConversation
Neverwinter Script Source
#include "nw_i0_tool"
void main()
{
object oPC = GetLastSpeaker();
if (GetListenPatternNumber()==1 && GetIsListening(OBJECT_SELF))
   {

       SpeakString ("Доступ разрешен");
       SetListenPattern(OBJECT_SELF,"**",10);

   }

}


И еще как запирать дверь открытую ключом, обратно на тот же ключ?
dumbo
MasterMage
в твоем ролике все работает потому, что ты работаешь с одним и тем же экземпляром объекта эффекта(здесь и далее под словом "объект" я подразумеваю не object, а набор некоторых данных). неудобство заключается в том, что на некоторые объекты нельзя создавать ссылки. т.е. скажем ссылку на object, int, float, string, location ты можешь сохранить в локальных данных какого-либо объекта, а вот с effect, itemproperty это не проходит, а жаль... приходится их перебирать.

Лито
дык это...
OnSpawn
Neverwinter Script Source
void main()
{
  SetListening(OBJECT_SELF, 1);
  SetListenPattern(OBJECT_SELF,"бубен",1);
  SetListenPattern(OBJECT_SELF,"**",2);
}


OnConversation
Neverwinter Script Source
void main()
{
  object oPC = GetLastSpeaker();
  object oDoor = GetObjectByTag("golem_door");
  if (!GetIsListening(OBJECT_SELF)) return;
  switch (GetListenPatternNumber())
  {
      case 1:
        SpeakString ("Проходи");
        // отмыкаем дверь
        SetLocked(oDoor, FALSE);
        AssignCommand(oDoor, ActionOpenDoor(oDoor));
        break;
      case 2:
        SpeakString ("Ты не пройдешь");
        break;
      default:
        SpeakString ("Скажи пароль и проходи...");
  }
}


запирание двери не зависит от условий лочки, выставленных в свойствах оной -
- почитай описание SetLocked
на дверь - OnOpen, OnUnlock:
Neverwinter Script Source
void main()
{
  // на дверь можно повесить переменную close_delay - смысл понятен, думаю...
  float fDelay = IntToFloat(GetLocalInt(OBJECT_SELF, "close_delay"));
  if (fDelay==0.0) fDelay = 5.0;
  DelayCommand(fDelay, SetLocked(OBJECT_SELF, 1));
  DelayCommand(fDelay, ActionCloseDoor(OBJECT_SELF));
}
dumbo
а кстати, к вопросу о ListenPattern'ах - никто не видел (или может быть сам делал) скрипт бота с зачатками интеллекта? nyam.gif
Oksivarus
Помогите разобратся со скритами смерти и умирания при исползовании в мульти. Никак немогу избавится от проблемы когда игрок умер но изза того что у него предметы с регенерацией у него жизнь в плюсах, выходит он живой мертвец так нистранно это звучит. Приэтом он лежит и неможет сдвинутся, заклинания моднять из мертвых или воскресить недействуют в такой ситуации. (могу если нужно выложить обы скрипта,они сделаны с использованием базы данного форума).
Tiger Greyhawk
QUOTE
И еще как запирать дверь открытую ключом, обратно на тот же ключ?

А поставить проверку наличия предмета (ключа) в инвентаре на OnClose слот . И затем запирать дверь. А если нет ключа, то только прикрыть дверь. Не то?
Лито
Tiger Greyhawk Нет, это немного не то...С этим я уже разобрался. Теперь у меня другой вопрос, может он глупый но все же dntknw.gif
Как сделать так чтобы при смерти игрок воскрешался без потери золота опыта и т.д , но только в определенной локе. Впринципе такой скрипт я могу написать, но куда его поставить не представляю...Это необходимо для арены
Tiger Greyhawk
А в слот модуля или локации OnDead? Может я конечно и туплю, но по-моему именно туда.
Лито
У локации нет слота OnDead, а модульный слот не подойдет, он ведь действует на весь модуль
Friedrich
Если от игрока требуется подтверждение того, что он хочет воскреснуть - используйте onPlayerRespawn, если он должен воскресать автоматически - onPlayerDeath модуля.

Для определения места гибели, используйте тэг локации:
Neverwinter Script Source
void main()
{
  object oPC = GetLastPlayerDied();
            //GetLastRespawnButtonPresser();
  string sArea = GetTag(GetArea(oPC));
  ...
  if (sArea == "MAP_KILLING_ARENA")
  {
    //ЗДЕСЬ ОПИШИТЕ ДЕЙСТВИЯ ПРИ УБИЙСВЕ ИГРОКА НА АРЕНЕ
  }
  ...
}

Добавлено в [mergetime]1108756556[/mergetime]
Посмотрите, как дефолтные онДес/Респавн сделаны...
Leon PRO
QUOTE
И еще как запирать дверь открытую ключом, обратно на тот же ключ?

Эмм... если ты имеешь ввиду, что дверь всегда должна после закрытия отпираться только ключом, то это итак есть, т.е. если дверь залочить умением lock и в свойствах замка еще в тулсете стоит требование на клоч, то после каждого простого лока, разлочить можно только имея ключ.
Tiger Greyhawk
QUOTE (Лито @ Feb 18 2005, 22:16)
У локации нет слота OnDead, а модульный слот не подойдет, он ведь действует на весь модуль

Сорри, попутался. Ну так ведь действительно, через проверку локи в слоте модуля. Или через OnUserDefind. Кстати, объясните мне как пользоваться этим слотом. Самый лучший вариант - ссылка на объяснение, если было такое.
Я к тому, что если я хочу поставить проверку на переменную (=0) и если она выполняется, то запускать какое-то условие (переменная = 100). Далее в хербите (любом) изменять переменную с шагом запуска хербита (6 сек в идеале) на 1 вниз. И когда переменная = 0 снова запускать ЮзерДэфайнд. Это возможно? Какие будут глюки или несоответствия? (В идеале получится запуск скрипта раз в 10 минут)
Наверное, я, в очередной раз, наступаю на грабли, которые уже обсуждались.
Лито
QUOTE (Leon PRO @ Feb 19 2005, 01:29)
Эмм... если ты имеешь ввиду, что дверь всегда должна после закрытия отпираться только ключом, то это итак есть, т.е. если дверь залочить умением lock и в свойствах замка еще в тулсете стоит требование на клоч, то после каждого простого лока, разлочить можно только имея ключ.

Нет это просто, сам знаю. Я про то что после того, как использовали ключ и открыли дверь,надо закрыть эту же дверь на тот же ключ. Но я уже все сделал...

Neverwinter Script Source
string sArea = GetTag(GetArea(oPC));
не компилируется строчка
Aiwan
QUOTE (Лито @ Feb 19 2005, 12:21)
не компилируется строчка

Neverwinter Script Source
object oPC = GetFirstPC();
string sArea = GetTag(GetArea(oPC));

А так?
Tiger Greyhawk проще выловить значения дат. GetTimeHour() и
Neverwinter Script Source
void main()
{
int iHour = GetTimeHour();
if (iHour = 12 || 24)
{
// Твое действие
}
}

Но все это конечно грубо. Можно сделать таймер всего модуля и по нему раздавать на Юзердеф объектам команды.
Tiger Greyhawk
QUOTE
Tiger Greyhawk проще выловить значения дат. GetTimeHour() и

Да я в общем-то так сейчас и делаю. Но меня это не до конца устраивает... Это к твоему пожеланию насчет слота OnOneHoure, OnOneDay... Неужели нет ничего более сносного? Этот скрипт ведь ставиться на хербит? По крайней мере я ставлю. Раньше ставил на каждого непися и, ес-но, это очень сильно лагало. Теперь делаю проверку в одном скрипте и запускаю другие. Но это тоже не окончательный выход, имхо. Ведь есть же что-нить умнее... Я апшибаюсь?
Lex
Парни, по поводу эффектов: я делаю именно так, как написал. И трабл нету. smile.gif
Гиларион
Я писать скрипты вооюще не умею и пока простенькие пытаюся создать в Визарде или в генераторе, но даже они не получаются!!!!! Вот такой я нуб... Как сделать правильно скрипт, проверки вещи в инвентаре??
И кстати с чего начать в их изучении???
Archangel
QUOTE
И кстати с чего начать в их изучении???


Для начала почитай статьи с сайта. Их ОЧЕНЬ много, а уж, если че-то будет непонятно, то задавай вопросы на форуме. Главное не стесняйся. bb.gif

QUOTE
Как сделать правильно скрипт, проверки вещи в инвентаре??


Что ты имеешь виду? Проверка вещи в инвенторе для чего? Опиши ситуацию по- подробнее... cool.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.