Grazzt, Dark Prince
Feb 14 2005, 17:22
И еще один мааленький вопросец
- можно ли манипулировать очередью actions обьектов? Утрировано - NPC по скрипту перемещается к тэгу А, потом к тэгу B, потом к тэгу C. Можно ли каким-то образом выяснить, есть ли к примеру в очереди для этого объекта комманда "переместиться к тэгу B" и очередность её выполнения относительно других комманд очереди? Можно ли каким-то образом "вручную" менять очередность?
Grazzt, Dark Prince зачем такие заморочки. Скрипт то ты сам пишешь. Вот и определись к каждому посту свои условия, к примеру дистанцию или вешавй локалку на НПС. А выуживание акций на кой?
Добавлено в [mergetime]1108395396[/mergetime]
Опиши твою ЗАДАЧУ. Мы подскажем как ее реализовать. А твои домыслы могут быть ужасно не в кассу...
Grazzt, Dark Prince
Feb 14 2005, 19:24
->Aiwan: Меня интересует сама возможность.
И нужно это мне скорее в целях более эффективной отладки сценариев игры. Понятное дело, что можно послать какой нибудь ClearAllActions, и попробовать сформировать цепочку событий самостоятельно. Но есть один тонкий момент - если цепочку событий для обьекта одновременно формируют несколько различных довольно обьемистых скриптов, то логика работы системы становится достаточно интересной и не всегда до конца предсказуемой в силу довольно таки высокой сложности этой самой логики и недостатка времени на бетатестирование. Как правило приходится довольно страшно изголяться с очисткой буфера комманд и локальными переменными, что не всегда (ну во всяком случае из моей скудной практики программирования под Аврору) есть гуд. Конечно можно сказать, что надо по возможности избегать таких моментов. Но увы и ах - не всегда это удается. И тогда наступают муки адовы, выражающиеся в длительных попытках найти логическую ошибку в собственных скриптах не имея нормальных средств отладки. Разобраться в этом помогло бы что-то вроде лога всех скриптовых комманд с результатами отработки, посланных во время игрового процесса. Но увы - этого видимо нет (а было бы удобно...). По этому на худой конец подошли бы и некие функции получения мгновенного состояния буфера комманд. Это был бы просто луч света в темном царстве.
Archangel
Feb 14 2005, 21:18
Здрастеся все.У меня тут небольшой косяк, помогите пжАААлуйста:
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);
// Здесь должна быть эта долбаная проверка
ActionEquipItem(GetItem("Mech",OBJECT_SELF),INVENTORY_SLOT_RIGHTHAND); SetLocalInt(OBJECT_SELF,"Mech",FALSE); } |
Этот скрипт вствляется в OnDamage(или как его там, непомню. Вообщем мысля понятна)НеПиСя.
И когда НеПиСь получает повреждение(т.е. его атакуют), то он должен достать меч.
В принципе все получается, но я не знаю как сделать проверку на, то, что НеПиСя атакуют.
Помогите.Плизззззз!
P.S.: КУДА ВСЕ РАЗБЕЖАЛИСЬ?
QUOTE |
Меня интересует сама возможность. |
Скорее всего нет.
QUOTE |
И нужно это мне скорее в целях более эффективной отладки сценариев игры. Понятное дело, что можно послать какой нибудь ClearAllActions, и попробовать сформировать цепочку событий самостоятельно. |
Извини, но твои запросы непонятны с точки зрения необходимости. Зачем выуживать то что там накопилось? И пытаться разобраться? ТЫ что, будешь сам ковырять стэк? Или доверишься СКРИПТУ? По твоей логике, ты делаешь подсластитель сахару. Ты и отличаешься от компьютера, что можешь сам задать логику своих скриптов и прочее. И вообще, ОПИШИ хоть ОДНУ ситуацию, когда тебе это действительно НАДО. В стэк помещается 75 акций. Ты получил 50 разных. Что делаешь?
Все что ты описал это не аргумент, это сожаления неумелого скриптера. Когда ты научишься писать скрипты хорошо, твой вопрос будет снят сам собой. Как что то в модуле работает без твоего ведома??? Я не пойму ты тогда зачем там?
Давай конкретную ситуацию. Ты делаешь то то, а происходит то-то и ты не знаешь почему. И поговорим.
QUOTE |
P.S.: КУДА ВСЕ РАЗБЕЖАЛИСЬ? |
Мы тут сидим от нечего делать и правим всем скрипты. Все остальное для нас пустой звук в мире.
О! Ну наконец я могу помочь страждущему!
Поставь это на ОнДамадж НПС.
Neverwinter Script Source |
void main() { object oItem = GetItemPossessedBy(OBJECT_SELF, "Mech"); ActionEquipItem(oItem, OBJECT_SELF, INVENTORY_SLOT_RIGHTHAND); } |
Archangel
Feb 15 2005, 12:27
QUOTE |
Мы тут сидим от нечего делать и правим всем скрипты. Все остальное для нас пустой звук в мире. |
Да, ладно
Aiwan...
Это я ж так, шуча.....
А за скрипт спасибушки! Добавлено в [mergetime]1108460998[/mergetime] Aiwan!Че-то твой скрипт не фурычит!
Я,конечно, мало че в этом понимаю, но вроде бы тута еще переменная нужна......
Пытался сам енто исправить, но не получилось. Ибо мозгов не хватает.
P.s.: Не компилится во 2й строчке.
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. по поводу "доставания меча" - во времена "игры запоем" обнаружил такую штуку:
если во время боя постоянно менять "набор оружия", процент попадания сильно
увеличивается... это, конечно, субъективно, но так показалось.
DBColl
Feb 15 2005, 13:46
dumbo
AssignCommand(OBJECT_SELF, ...) - это бессмысленная строка. Достаточно просто
ClearAllActions();
ActionEquipItem(...);
DetermineCombatRound(...);
DBCollкаюсь. AssignCommand применительно к селфу - лишнее стопудово
взял из первого попавшегося скрипта, особо не раздумывая... а надо было.
Grazzt, Dark Prince
Feb 15 2005, 15:25
>Aiwan: Немного флуда (непреднамереного) и вопрос. Необходимость простая - отладка. Другой нет (пока). Ничего предосудительного в том, чтобы если уж существует буфер акций, то иметь возможность полноценной работы с ним, я не вижу (можно отнести к разделу моих пожеланий по второму NWN
). Ну впрочем вчера я и без этого разобрался. Проблема была в синхронизации действий "босса" и его "подручных" во время боя с PC и была связана с несколько некорректным планированием боевой ситуации с моей стороны. Нужно было точно синхронизировать работу трех скриптов, в одном из которых была ветка, завязяная на здоровье "босса". Из-за разности наносимого демеджа в конкретный момент времени в различных тестовых боях в некоторых случаях возникало рассогласование действий актеров. И в результате получалось тоже неплохо, но не так, как я хотел (в основном из-за не вовремя посланных DelayCommand). Решилось все просто изменением значения двух локальных переменных. Чисто (на мой непросвященный взгляд) логическая ошибка, на которую я угробил 8,5 часов своего драгоценного времени и чего бы не было, знай я содержимое буфера. А так пришлось сендить все имеющиеся переменные и долго и упорно ловить мелкий(?!) но гадский глюк. На счет опытности ты прав - на Авроре я програмлю всего неделю, по этому скрипты у меня вероятно еще не очень хорошие
Впрочем ничего особенного в Авроре нет кроме массы нюансов (а в них вся соль!), которых о которых я еще (пока!) не знаю. Например (это уже вопрос!) 75 акций - это для всех обьектов или для одного?
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) |
А так пришлось сендить все имеющиеся переменные и долго и упорно ловить мелкий(?!) но гадский глюк. |
Давай поговорим через год. Тогда ты скажешь, нужна эта функция для доставания акций из стэка или нет. За два с лишним года ты первый кто об этом заикается. Но скажу так, никакие функции не заменят кривых скриптов. Мне интересно, как ты собрался десять акций идти по вейпам узнавать из какого скрипта какая акция? Ты хочешь еще кнопочку еррорлог, и тебе пишет тулсет где какую запятую тебе поставить, мол вы ошиблись.
Учись скриптить и не морочь нам голову. К тому же, ты разбираешься в них неплохо для новичка. Так что скоро будешь смеяться над своим предложением.
DBColl
Feb 15 2005, 17:22
QUOTE (Grazzt @ Dark Prince, Feb 15 2005, 14:25) |
Например (это уже вопрос!) 75 акций - это для всех обьектов или для одного? |
Для КАЖДОГО объекта.
А иметь возможность просматривать стек акций было бы действительно неплохо...
QUOTE (DBColl @ Feb 15 2005, 20:22) |
А иметь возможность просматривать стек акций было бы действительно неплохо... |
Согласен. Но не сделает Биовар это вам. Обсидан тоесть... Скажут учите Лексикон.
MasterMage
Feb 15 2005, 18:12
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
Feb 15 2005, 19:10
[SIZE=1]
QUOTE (Aiwan @ Feb 15 2005, 17:54) |
Согласен. Но не сделает Биовар это вам. Обсидан тоесть... Скажут учите Лексикон. |
Ну ведь есть раздел пожеланий. Наверно если хорошенько пожелать
, да еще кто-то не поленится перевести...
Так и вертится цитата:
"...Ибо Писание говорит фараону: для того самого Я и поставил тебя, чтобы показать над тобою силу Мою и чтобы проповедано было имя Мое по всей земле... " Послание св. Павла к римлянам.
MasterMage
Feb 15 2005, 19:26
Grazzt, Dark Prince ЭХ......мыслители..... Ээээээээх...
Aiwan СМОТРИ, СМОТРИ СЮДА!!!!
Вот смотри... решил сделать скрипт, как вещи Нашера...Там где статы прибавлябтся, если все собрал... Но не понял особо инклуды и готовые, поэтому написал свой...
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);
}
} |
это когда снял, но иконки эффекта не исчезают.... есть что-нить полегче, да и заодно подскажи, как полегче сделать.... Не зря ученик у учителю обращается...
MasterMage
тебе надо делать не EffectAbilityDecrease, а цикл по уже наложенным эффектам на перса, выуживать наложенные тобой, и их снимать. А так ты вешаешь допольнительные новые эффекты на снимании...
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!")); } |
Проверил, все работает
MasterMage я такие скрипты не писал. Спроси ДБа или Лекса.
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) |
Ты хочешь еще кнопочку еррорлог, и тебе пишет тулсет где какую запятую тебе поставить, мол вы ошиблись.Учись скриптить и не морочь нам голову. |
Не кипятись.
боюсь, что и 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); } } } |
дабы не сымать "чужие" эффекты, стоит проверочка на создателя...
если я правильно помню, то этим не обойдешься, если хочешь,
чтоб все ровно было - после реста эти эффекты "улетают"...
Хехе, нет,
dumbo, тут я все попал.
CODE |
effect eSleep=EffectSleep(); RemoveEffect(oPC, eSleep); This doesn't work...
|
но я то что удаляю?
CODE |
ePCEffect = GetNextEffect(oPC); RemoveEffect(oPC,ePCEffect);
|
Проверку на креатора можно внести в мой вариант, но просто подъем стата на 10 пунктов вещь довольно редкая.
Но твой вариант тоже верен. За одним НО
- снимутся все эффекты повышения статов, наложенных модулем. А это могут быть эффекты от других вещей. (например зелье ловкости. Хотя тут я не уверен, что эффект накладывает модуль, надо попробовать.)
Я уже сталкивался с подобными делами. У себя я демал моим вариантом + проверял креатора. Чтобы уж наверняка. (креатором был НПС Effector, что стоял у меня в закрытой локации. )
Lexэх, спорить буду.
спраУку я привел немного не для того... а для чего - сейчас поймешь.
удаляешь ты тот что нужно эфект, перечисляемый. да. но!
обрати внимание с чем ты его сравниваешь. вот где порылась собака,
описываемая в нотайсе. ты сравниваешь эффект созданный (давно
в OnEquip
с только что созданным
новым эффектом. даже если эту конструкцию
пропустит компилер, в чем я сомневаюсь, равны они никак и никогда не будут.
спецовый НПС-зэк - стопудовый хит в деле создания скриптов...
это я упустил. а зря.
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
Feb 16 2005, 10:51
ShadСпасибо Дома Попробую, сделать.
Добавлено в [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)); }
} |
его ещё не проверял хочу посаветывотся.
DBColl
Feb 16 2005, 11:36
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.
запустил-таки я этот гадский(потому что тормознооой) тулсет...
в конструкции
Lex'a типа ePCEffect==eEf1, которая почему-то навеяла на меня сомнения(которые, впрочем, через некоторое время после нажатия кнопки "Отправить", рассеялись. просто редактировать посты - не мое
относительно компилябельности, с этой точки зрения ничего предосудительного нет.
итак - краткое руководство по созданию "набора нашера":
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...
MasterMage
Feb 16 2005, 20:50
dumbo Lex пасибо...Туго у меня с while, но с остальным понял....Просто не знал как через уайл задать, чтоб не убирались все эййекты....
И кстати....Помнится с Дб говорили...
Remove убирает только эффекты с одного скрипта...В одном теле....
Обидно
MasterMage, не понял тебя.
какие "эффекты с одного скрипта"? какие тела?
Remove убирает то, что ему говорят, независимо от того, откуда это взялось.
•Immortal•
Feb 16 2005, 21:51
Нужен скрипт чтобы непись давал плееру 10 лямов при базаре, просто я сам никрена в скриптах не лазею...
Tiger Greyhawk
Feb 17 2005, 04:00
QUOTE (•Immortal• @ Feb 16 2005, 21:51) |
Нужен скрипт чтобы непись давал плееру 10 лямов при базаре, просто я сам никрена в скриптах не лазею... |
На ветке диалога, где нужно дать "10 лямов", переходишь на вкладку Action Taken (Совершены действия). Это справа внизу. Там нажимаешь на кнопку с иконкой красной шляпы. Далее разберешься.
Либо, если хочешь готовый, то:
Neverwinter Script Source |
void main() { GiveGoldToCreature(GetPCSpeaker(), 1000000); } |
Пока не особо разбираешься в скриптах, юзай wizard`а (красная шляпка) и обязательно качай учебник Aiwan`а. Для новичка, ИМХО, самое лучшее. + даже если плохо знаешь англ, все равно используй lexicon. Там достаточно просто со словарем разобраться. + в редакторе скриптов, справа вверху есть фильтр. Большинство функций имеют в своем теле англ. слова. Обрати внимание на функцию выше. ДатьЗолотоСозданию. Соответсвенно в фильтре ты можешь ввести gold, и он тебе выдаст все функции, которые содержат этот набор букв (здесь gold), а это почти тоже самое, что и работают с этим набором букв (здесь золотом).
QUOTE (Nokoll @ Feb 16 2005, 10:51) |
Shad Спасибо Дома Попробую, сделать. <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)); }
} |
его ещё не проверял хочу посаветывотся. |
Можно и так, но тогда чётко ограничено количество узлов, и чтобы это хотябы заработало надо добавить пару строчек так:
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
Feb 17 2005, 09:19
dumbo
смотри
В одном скрипте создал еффект, это раз
В другом ты хочешь его убрать RemoveEffect (oPC,eEf);, но он не уберет, так как не находит
Но если в скрипте
(смотри мой ролик в "Построение скриптовых сцен")
Добавлено в [mergetime]1108621226[/mergetime]
сначала создал, а потом убираешь, то убирается
Такой вопрос. Есть голем страж, который реагирует на слово произносимое игроком. Это я смог сделать(спасибо Авадону, написавший скрипт для банка
)
Но как сделать чтобы на любое другое слово, голем произносил, например...."неверно"?
Вот скрипт который я уже написал:
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);
}
} |
И еще как запирать дверь открытую ключом, обратно на тот же ключ?
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)); } |
а кстати, к вопросу о ListenPattern'ах - никто не видел (или может быть сам делал) скрипт бота с зачатками интеллекта?
Oksivarus
Feb 18 2005, 01:50
Помогите разобратся со скритами смерти и умирания при исползовании в мульти. Никак немогу избавится от проблемы когда игрок умер но изза того что у него предметы с регенерацией у него жизнь в плюсах, выходит он живой мертвец так нистранно это звучит. Приэтом он лежит и неможет сдвинутся, заклинания моднять из мертвых или воскресить недействуют в такой ситуации. (могу если нужно выложить обы скрипта,они сделаны с использованием базы данного форума).
Tiger Greyhawk
Feb 18 2005, 03:32
QUOTE |
И еще как запирать дверь открытую ключом, обратно на тот же ключ? |
А поставить проверку наличия предмета (ключа) в инвентаре на OnClose слот . И затем запирать дверь. А если нет ключа, то только прикрыть дверь. Не то?
Tiger Greyhawk Нет, это немного не то...С этим я уже разобрался. Теперь у меня другой вопрос, может он глупый но все же
Как сделать так чтобы при смерти игрок воскрешался без потери золота опыта и т.д , но только в определенной локе. Впринципе такой скрипт я могу написать, но куда его поставить не представляю...Это необходимо для арены
Tiger Greyhawk
Feb 18 2005, 15:56
А в слот модуля или локации OnDead? Может я конечно и туплю, но по-моему именно туда.
У локации нет слота OnDead, а модульный слот не подойдет, он ведь действует на весь модуль
Friedrich
Feb 18 2005, 22:54
Если от игрока требуется подтверждение того, что он хочет воскреснуть - используйте 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
Feb 19 2005, 01:29
QUOTE |
И еще как запирать дверь открытую ключом, обратно на тот же ключ? |
Эмм... если ты имеешь ввиду, что дверь всегда должна после закрытия отпираться только ключом, то это итак есть, т.е. если дверь залочить умением lock и в свойствах замка еще в тулсете стоит требование на клоч, то после каждого простого лока, разлочить можно только имея ключ.
Tiger Greyhawk
Feb 19 2005, 04:30
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)); |
не компилируется строчка
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
Feb 19 2005, 14:50
QUOTE |
Tiger Greyhawk проще выловить значения дат. GetTimeHour() и |
Да я в общем-то так сейчас и делаю. Но меня это не до конца устраивает... Это к твоему пожеланию насчет слота OnOneHoure, OnOneDay... Неужели нет ничего более сносного? Этот скрипт ведь ставиться на хербит? По крайней мере я ставлю. Раньше ставил на каждого непися и, ес-но, это очень сильно лагало. Теперь делаю проверку в одном скрипте и запускаю другие. Но это тоже не окончательный выход, имхо. Ведь есть же что-нить умнее... Я апшибаюсь?
Парни, по поводу эффектов: я делаю именно так, как написал. И трабл нету.
Гиларион
Feb 19 2005, 21:11
Я писать скрипты вооюще не умею и пока простенькие пытаюся создать в Визарде или в генераторе, но даже они не получаются!!!!! Вот такой я нуб... Как сделать правильно скрипт, проверки вещи в инвентаре??
И кстати с чего начать в их изучении???
Archangel
Feb 19 2005, 21:40
QUOTE |
И кстати с чего начать в их изучении??? |
Для начала почитай статьи с сайта. Их ОЧЕНЬ много, а уж, если че-то будет непонятно, то задавай вопросы на форуме. Главное не стесняйся.
QUOTE |
Как сделать правильно скрипт, проверки вещи в инвентаре?? |
Что ты имеешь виду? Проверка вещи в инвенторе для чего? Опиши ситуацию по- подробнее...