Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights 2 Obsidian Toolset _ Азы скриптинга NWN/NWN2. Внеклассные занятия

Автор: Neo Oct 6 2007, 22:55

а это... можно спросить? blush.gif а что такое переменная? blush.gif

Автор: Aiwan Oct 7 2007, 11:45

Переме́нная в традиционных языках программирования — поименованная ячейка памяти, имя которой можно использовать для осуществления доступа к данным, находящимся по данному адресу.
http://ru.wikipedia.org (с)

Автор: Vhall Oct 7 2007, 13:43

QUOTE(Ёжик @ Oct 7 2007, 14:03) *
Почему oNeo, oLex, oAiwan? Что значит object oAiwan = GetObjectByTag("Aiwan ROOT Boss")?

В строке
Neverwinter Script Source
object oAiwan = GetObjectByTag("Aiwan ROOT Boss")

мы говорим о том, что когда в последствии обратимся (GetObjectByTag) к oAiwan - это будет объект (GetObjectByTag) c тегом (GetObjectByTag) "Aiwan ROOT Boss".
В object'e можно писать что угодно. Но для удобства лучше ассоциировать его с тегом.

Автор: shadowdweller Oct 7 2007, 14:38

Цитата(Ёжик @ Oct 7 2007, 14:03) *
Почему oNeo, oLex, oAiwan?

А это звательный падеж biggrin.gif
Серьезно - исключительно для твоего собственного удобства. Буква "о" в начале названия объекта означает, что это именно объект, чтобы ты сама потом разобралась. Можно без этого обойтись.
Цитата(Ёжик @ Oct 7 2007, 14:03) *
Что такое int StartingConditional()?

Conditioinal - это условие.
StartingConditioinal - это условие, открывающее скрипт. Eсли оно выполняется, скрипт начинает работу.
Цитата(Ёжик @ Oct 7 2007, 14:03) *
void main - это что?

void main - это основная функция. Ты просто указываешь, откуда брать данные - из списка основных функций языка. Потому что есть еще функции пользовательские - те, которых нет в списке и которые скриптеры пишут сами. Ну, это я так понимаю, во всяком случае. Меня здесь вообще быть не должно ph34r.gif

Автор: mamuc Oct 8 2007, 09:26

Цитата
Интеджер integer - это целое значение. может быть 1, 10, 25 и т.д.

маленькое уточнение целые числа - это не только натуральные (как в примере Айвана - "может быть 1, 10, 25 ") но и 0 и также негативные -1б -10, -125

------------------------------------------

Цитата
void main - это что?

Цитата
ну тогда вычеркни меня и всё

ээ колючая не надо сразу иголками колотьс...больно же rolleyes.gif

если ты пишешь скрипт, то это означает, что ты пишешь инструкцию для компа, что как и когда делать...ты эту инструкцию пишешь на определенном языке и ,как у каждого языка , у скриптов есть свои граматические правила что бы исполнитель( то есть комп) мог тебя правильно понять .. комп у нас испольнитель шустрый, но тупой biggrin.gif
поэтому ему надо расписать "обьясняя на пальцах" declare.gif
каждая такая инструкция для компа называеться функцией
она начинаеться с слова void и весь ее текст заключаеться между кавычками { и }
одна среди них есть главная( та которая и начинаеться с void main )
между кавычками главной ты и записываешь те действия которые нужно, что бы комп сделал
там может быть и коментарии( которые просто для себя пишешь, а комп их не выполняет rolleyes.gif )
и обьявление различных переменных,и выплнения каких то других действий и функций
другие функции есть трех видов
1) те которые ты используешь готовыми( они уже написаны и "зашиты" при написании тулсета)
2) те которые написали другие люди , а ты скопировала и до бавила в свои скрипты
3) те которые ты написала сама
это как с приготовлением празничного обеда:
ты берешь тарелки , вилки , ложки, супницы( встроенные функции) , берешь принесенный из кулинарии торт и шампанское( готовые функции написанные другими), добавляешь свой любимый салат и собственноручно испеченые ватрушечки(тобою написанные функции) , на стол стелишь скатерть и ставишь цветы ( разные другие действия) и вместе у тебя получаеться празничный стол(void main ) к которому садяться и все это уплетают пользователи

вот пимерно так declare.gif

Автор: Neo Oct 8 2007, 13:43

Цитата(mamuc @ Oct 8 2007, 10:26) *
маленькое уточнение целые числа - это не только натуральные

ну тогда уж уточнение, целочисленные данные бывают со знаком и без smile.gif правда в нвн такого деления нет, но тем не менее smile.gif

Автор: mamuc Oct 8 2007, 14:23

Цитата
Каждый в скрипте имя oSelf сменит на свой ник, например oAiwan и напишет в этой теме результат. ПИШИТЕ В РЕДАКТОРЕ И КОМПИЛИТЕ.

scratch_one-s_head.gif
а результата как таковово то НЕ БУДЕТ

ибо, что бы увидеть КАК СКРИПТ СРАБОТАЕТ ему нужно место ГДЕ он это может сделать
то есть не хватит просто скрипта как такового
надо еще и создать возможность как то проявить себя
поэтому сделайте лучше так :
-откройте новый модуль в тулсете с одной малюсенькой локой
-поставьте на этой локе один плейсебл( например сундук)
-сделайте его юзабельным , если он статичен (соотв галочка в свойствах плейса )
-напиштие скрипт предложеный Айваном сохраните его под каким то именем (например aivan0001)
-повесьте этот скритп на ON CLOSE вашего сундука
(откройте свойства плейса возмите страницу Scripts и там на слоте On Close смените стандартный скрипт на aivan0001)
-сохраните модуль
-запустите модуль как игрок, подойдите к сундуку и откройте и закройте его
и вы получите соотв то что требовалось mosking.gif
- опишите , что вышло Айвану declare.gif

п.с. если какой то орел супермодератор ЕЩЕ раз будет перемещать УЧЕБНЫЕ посты куда попало, то я ему клюв загну, перья из хвоста повыдергаю и в уши засуну , апотом скажу, что так все и было ...вот aggressive.gifrolleyes.gif

Автор: Aiwan Oct 8 2007, 16:14

mamuc, мне нужен был результат в виде кода. Я хочу начать с азов. Ты не понял. Пусть меняют только описание и компилят, что бы видеть ошибки свои же. Если не компилится.

Автор: Artlira Oct 9 2007, 02:36

mamuc

Если проиграть вариант с сундуком, то должно получиться следующее?
При условии, что сундук пуст (OnClose), он же и лишится 5 хитов? Объектом же, как его не обзови (oSelf или oLira) будет сам сундук?

Автор: Lex Oct 9 2007, 08:15

Да, именно так и будет.

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

Есть мысли (Хотя бы на словах), как сделать так, чтобы урон нанесся игроку?

Автор: mamuc Oct 9 2007, 08:54

Цитата
При условии, что сундук пуст (OnClose),

cкрипт на OnClose срабатывает каждый раз , когда сундук закрываеться и не важно пустой он или лежит там что-то - то есть не проверяеться содержание сундука
и тот вариант скрипта , который предложил вам Айван действительно сработает на сам сундук ибо там береться обьект по умолчанию, что не всегда есть гут biggrin.gif
поэтому давайте подумайте над предложением Лекса
Цитата
Есть мысли (Хотя бы на словах), как сделать так, чтобы урон нанесся игроку?

а именно
1) какую строчку надо изменить в скрите чтобы усе работало на игрока
2) пердложите, что мименно надо сделать , какую команду и как использовать( если не знаете соотв действие, то опишите своими словами)

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


п.с. чертовски НЕУДОБНО искуственное разделение на две темы... теряеться смысл
поэтому предлагаю модераторам ДВАЖДЫ ПОДУМАТЬ прежде чем переносить посты из темы в тему ( моя ОЧЕНЬ ЗЛОЙ spiteful.gif становиться кстати)
а лучше вообще обе темы обьеденить обратно

Автор: Aiwan Oct 9 2007, 09:10

Не надо ничего объединять. Лебедь Рак и Щука тоже делали одно дело biggrin.gif

Автор: mamuc Oct 9 2007, 09:19

Цитата
Не надо ничего объединять. Лебедь Рак и Щука тоже делали одно дело


то есть это мягое напоминамие ударом дубиной, что помщники тебе не нужны и ты только сам и один будешь все делать?

ну чтож, тогда имею честь откланиться

как выразился здесь один кооолючий Ежик
можете вычеркивать меня

счастливо оставаться

Автор: Griffon Oct 9 2007, 11:33

Хорош вам уже грызться diablo.gif

Neverwinter Script Source
object Target=PC
//хотя может РС стоит писать "РС"?
// или 2-вариант
object oPC=OBJECT_SELF


Neverwinter Script Source
// Create a Damage effect
// - nDamageAmount: amount of damage to be dealt. This should be applied as an
//  instantaneous effect.
// - nDamageType: DAMAGE_TYPE_*
// - nDamagePower: DAMAGE_POWER_*
// - nIgnoreResistances: FALSE will use damage immunity, damage reduction, and damage resistance.  TRUE will skip all of these.
effect EffectDamage(int nDamageAmount, int nDamageType=DAMAGE_TYPE_MAGICAL, int nDamagePower=DAMAGE_POWER_NORMAL, int nIgnoreResistances=FALSE);


НО результат все тот же 0.85.nss(1) ERROS: ELLIPSIS IN IDENTIFIER. crazy.gif

Автор: Aiwan Oct 9 2007, 11:52

Цитата(mamuc @ Oct 9 2007, 12:19) *
то есть это мягое напоминамие ударом дубиной, что помщники тебе не нужны и ты только сам и один будешь все делать?

Зря ты. Мне просто нужно самому контролировать весь процесс. Если каждый будет писать в той теме то получится куча мала. Я ж в самом начале сказал ТАМ ПИШУТ ТОЛЬЯКО Я И УЧЕНИКИ. Не обижайся wink3.gif Но мне сложно что то делать когда со всех сторон что то кто то будет писать. Я пытаюсь дать народу материал как я задумал, а твои задачи слишком сложны. Поверь.

Автор: mamuc Oct 9 2007, 11:56

Цитата
object Target=PC

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

а что именно это за буквосочетание ни в самом скрипте , ни в какмо нибудь подключенном инклюде( позже узнаеете что это такое) не определено и по этому непонятно для компа - вот тебя и ругает комп за ошибку unsure.gif

и еще одно уточнение - нам надо найти не вообще какого - то PC , а именно того PC который только что закрЫл сундук
то есть нам надо отследить СОБЫТИЕ которое произошло и по нему определить нужного PCя...
это событие из ряда стандартных - значит должна быть уже какая то стандартная функция отлавливающее такое действие и выявляющее преступное лицо оное совершившее
в тулсете есть длинный список таких стандартных функций (кстати с описаниями)
и у одной описание следующее
Цитата
// Use this in an OnClosed script to get the object that closed the door or placeable.
// * Returns OBJECT_INVALID if the caller is not a valid door or placeable.


( я конечно могу просто написать как правильно, но самим найденое гораздо ценне в виде опыта ИМХО)

попробуй найти эту функцию и применить ее ( знающим английский язык более менее это не должно составить труда rolleyes.gif )


то Aiwan ок проехали - мир дружба скрипты declare.gif

и не так они сложны - просто так сразу виден результат при правильно исполнеии declare.gif
и выявляються непонятные вопросы- которые нам кажутся само собой разумеющимся, а начинающим нет ..так что учаться не только они, но и мы учимся как лучше учить good.gif

Автор: Griffon Oct 9 2007, 12:27

Найти не так все сложно

Neverwinter Script Source
int GetIsUsedByPlayer( object oCreature ); // не совсем уверен за правильность, но что-то такое сразу всплыло
и

Neverwinter Script Source
void main()
{
    object oUser = GetLastUsedBy();

    PrettyDebug( GetName( OBJECT_SELF ) + "'s was used by " + GetName( oUser ) );

    // Do something
}


Neverwinter Script Source
// Placeable OnUsed Template   
/*
    Required: Static=FALSE, Usable=TRUE, CurrentHP>0, attach script to the OnUsed event
    Suggested: Plot=TRUE, DefaultActionPreference="Use"
*/

//

#include "ginc_debug"

// i_temp_aq
/*
  Template for an Acquire item script.
  This script will run each time the item is acquired.
 
  How to use this script:
  Replace the word "temp" (in line 1) with the tag of the item.  Rename the script with this name. 
   
  Additional Info:
  In general, all the item "tag-based" scripts will be named as follows:
  - a prefix ("i_" by defualt)
  - the tag of the item
  - a postfix indicating the item event.
 
  This script will be called automatically (by defualt) whether it exists or not.  If if does not exist, nothing happens.
  "_aq" was used for the Acquire postfix because "_ac" was already taken by Activate. 
 
  Note: this script runs on the module object, an important consideration for assigning actions.
  -ChazM


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

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

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

Автор: mamuc Oct 9 2007, 13:05

Цитата
object oUser = GetLastUsedBy() ;

это есть то очем я и писал - почти правильная функция
(только лучше вместо GetLastUsedBy()( которую обычно применяют несколько в другом ключе-когда определяет кто юзал специальное свойство предмета) взять GetLastClosedBy()-ведь то что произойде произойдет после того как кое-кто закроет сундук)
а остальное ты копнул слишком глубоко rolleyes.gif там тебе и инклюд подключеный появился и еще много чего
...совет - пока не рой до основания все а учись погружаться постепенно rolleyes.gif

теперь ты можешь немного смодифицировать скрипт Айвана
и попробовать запустить модуль

попробуй сам смодифицировать если есть сейчас время

кроме строчки, где выясняеться кто есть последний закрыватель
можно еще последнюю длиную строчку упростить - не нужда порядковая команда оставь один Эфект

п.с. отредактировал это сообщение, так как оказалось, что перед уходом последние изменения не дошли

Автор: Artlira Oct 9 2007, 13:40

Цитата
Есть мысли (Хотя бы на словах), как сделать так, чтобы урон нанесся игроку?


Цитата
1) какую строчку надо изменить в скрите чтобы усе работало на игрока


Мне кажется надо изменить определение объекта? Что бы эффект сработал на игрока в скрипте должно быть указано ("тот кто откроет сундук")? Скорее всего, это и будет игрок, неписи без разрешения по сундукам не лазят. Только как определить игрока?
object oPC = GetPCSpeaker() ? И слот на сундуке должен поменяться на OnUsed или OnOpen? Если правильно, то дальше в скрипте oSelf меняем на oPC?

Цитата
и вторая задача : подумайте каким должен быть скрипт, что бы сундук работал как уничтожитель предметов положеных в него..

object oItem = GetFirstItemInInventory(oChest);? Любой предмет нужно обозначить как предмет лежащий в этом сундуке, затем проверить есть этот объект или нет и если есть, его дестроить?
DestroyObject(oItem);

Автор: Griffon Oct 9 2007, 13:40

Цитата(mamuc @ Oct 9 2007, 12:56) *
и еще одно уточнение - нам надо найти не вообще какого - то PC , а именно того PC который только что закрЫл сундук


это решается элементарно на мой взгляд
Neverwinter Script Source
GetName( OBJECT_SELF ) + "'s was used by " + GetName( oUser ) );
эх, мог бы написать, уже б сделал. моя идея в чем если нам нужно поймать конкретного игрока, то дела6ем проверку по имени на открывание, ну а затем сообщение в полицию, например, что вот последний и был ОН. Насколько я слабо знаю скрипты, такую идею реализовать среднему раз плюнуть.

Автор: mamuc Oct 9 2007, 13:53

Цитата
Мне кажется надо изменить определение объекта? Что бы эффект сработал на игрока в скрипте должно быть указано ("тот кто откроет сундук")?

правильно надо изменить определение обьекта good.gif
Цитата
object oPC = GetPCSpeaker()

нет по другому( ибо эта функция определяет кто разговаривает), как уже нарыл Griffon есть функция для этого специальная , только он немного не ту функцию взял (лучше вместо GetLastUsedBy() взять GetLastClosedBy())
ведь то что произойде произойдет после того как кое-кто закроет сундук-значит определять бум примерно так
Neverwinter Script Source
object oPC = GetLastClosedBy()


а дальше уже с этим определенным oPC будем делать что захотим

а захотим мы (например )то, что бы при закрытии declare.gif declare.gifсундук дал 1000 голдов закрывающему ...мы ведь л юбим деньги

( тут я изменил немного задание(и упростил при этом скрипт) что бы задания были более разными и не путались с Айвана
... а когда осилите это, то и со скриптом Айвана разберетесь)
Neverwinter Script Source
void main()
{
      object oPC = GetLastClosedBy(); // zdesj opredelili kto zakril sunduk
     // zdesj nado dobavitj ODNU stroku s vidachej zolota
    
}


а теперь найдите функцию с какой вы можете дать 1000 голдов игроку prankster2.gif

маленькое наблюдение :
во время разборок скриптоа вы уже мимоходом выяснили три функции выполняющие близкостоящие задачи определения PC
1) GetPCSpeaker() - определяет кто разговаривает с НПЦ
2) GetLastUsedBy() - определяет, кто юзает специальное свойство итема
3) GetLastClosedBy() - определяет , кто закрыл инвентарь обьекта

и теперь сможете их применять в своих скриптах...


Автор: Artlira Oct 9 2007, 14:42

Цитата
а теперь найдите функцию с какой вы можете дать 1000 голдов игроку

GiveGoldToCreature(GetPCSpeaker(),1000);? тому кто говорит

GiveGoldToCreature(GetLastClosedBy(),1000)? тому кто закрыл?

Автор: mamuc Oct 9 2007, 14:53

Цитата
GiveGoldToCreature(GetPCSpeaker(),1000);?

функция правильная, только вместо GetPCSpeaker() будем ставить уже определенный в первой строчке обьект (oPC)
итого вторая строчка скрипта будет выглядеть так

Цитата
GiveGoldToCreature(oPC,1000);



Автор: Griffon Oct 9 2007, 14:56

Не не верно. Это подойдет при разговоре. Правильная тот кто его использовал, врнее закрыл, т.е. GetLastClosed

P.S. Мое сообщение должно стоять перед Мамуком. А разве нельзя сделать получение на того кто его закрыл последним? Ведь в нашем случае, это и есть игрок.

Автор: mamuc Oct 9 2007, 15:27

Цитата
GiveGoldToCreature(GetLastClosedBy(),1000)? тому кто закрыл?

да можно и одной строчкой biggrin.gif

но тогда это наверно и будет единственной строчкой скрипта

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

а
Цитата
GiveGoldToCreature(GetPCSpeaker(),1000)

обычно используеться в диалогах

п.с. ну если с этим разобрались подумайте тогда о втором задании :

как скриптом сделать уничтожение всего , что положат в сундук

если не можете написать сами скрипт, то опишите, как вы это предстваляете-какие действия для этого требуються выполнить по порядку 1,2,3 .....




Автор: Lex Oct 9 2007, 15:59

Цитата(Artlira @ Oct 9 2007, 15:42) *
GiveGoldToCreature(GetPCSpeaker(),1000);? тому кто говорит

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

Автор: Griffon Oct 9 2007, 18:34

Neverwinter Script Source
void main()
{
    object oPC      = GetPCItemLastEquippedBy();
    object oItem    = GetPCItemLastEquipped();

    //собственно само уничтожение DestroyObject

   
}


Добавлено через 7 минут 47 секунд

пришла идея ловить все предметы пошагово biggrin.gif

Neverwinter Script Source
object GetFirstItemInInventory(object oTarget=OBJECT_SELF);

object GetNextItemInInventory(object oTarget=OBJECT_SELF);

//собственно само уничтожение предметов DestroyObject

Автор: Lex Oct 9 2007, 19:51

Цитата(Griffon @ Oct 9 2007, 19:34) *
пришла идея ловить все предметы пошагово

чет я шагов не вижу. Ты выделил только 2 предмета, а остальные? smile.gif

Автор: Griffon Oct 9 2007, 21:24

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

Автор: Lex Oct 9 2007, 21:27

Цитата(Griffon @ Oct 9 2007, 22:24) *
пасать скрипт на проверку его пустоты

подсказка: проверка пустоты - инвалидность (OBJECT_INVALID, GetIsObjectValid) очередного взятого предмета (GetNextItemInInventory).
Инвалидный - несуществующий или неправильно заданный объект. Скажем мы пытаемся найти в модуле объект с тэгом "LEX", а такого объекта там нет.

Автор: Artlira Oct 10 2007, 04:14

Цитата
как скриптом сделать уничтожение всего , что положат в сундук

если не можете написать сами скрипт, то опишите, как вы это предстваляете-какие действия для этого требуються выполнить по порядку 1,2,3 .....


Скрипт скорее всего написать не смогу. Если просто рассуждать, как оно должно выглядеть, то наверно так:
1. Обозначить сам сундук как объект (oChest)
object oChest = GetObjectByTag("Sunduc_1") с заданным тагом.

2. Обозначить любой предмет, как предмет лежащий в этом сундуке
object oItem = GetFirstItemInInventory(oChest) ?

3. Проверять 1 действием скрипта пустой ли сундук, если пустой, то должен быть выход из скрипта?

4. 2 действием проверить - есть ли в инвентаре сундука любой предмет (oItem), не знаю нужно ли в этом случае проверять кем положен? По условиям скрипта (уничтожение любого предмета) это вроде не требуется?

5. Если такой предмет найден, он должен быть уничтожен.
DestroyObject(oItem) ? и снова выход из скрипта.

Не совсем понятно на какой слот надо будет ставить этот скрипт, на OnHeartbeat или OnUsed?

Автор: Lex Oct 10 2007, 08:55

Цитата(Artlira @ Oct 10 2007, 05:14) *
2. Обозначить любой предмет, как предмет лежащий в этом сундуке
object oItem = GetFirstItemInInventory(oChest) ?

беда в том, что это - первый предмет в сундуке. Так как удаление происходит с задержкой, то предложенный вариант (удаляем первый, значит первым становится другой, его тож удаляем и тд) не получается.
Цитата(Artlira @ Oct 10 2007, 05:14) *
Не совсем понятно на какой слот надо будет ставить этот скрипт, на OnHeartbeat или OnUsed?

в постановке задачи сказано, что на закрытие сундука

в целом что-то есть, но не достаточно детализированно. Скажем не очень понятно, как твои 4 пункта сработают если в сундуке 5 предметов.

Автор: mamuc Oct 10 2007, 09:25

то Griffon

Цитата
void main()
{
object oPC = GetPCItemLastEquippedBy();
object oItem = GetPCItemLastEquipped();

//собственно само уничтожение DestroyObject
}

это можно использовать для написания скрипта по уничтожению..но только если пишется скриптпо уничтожению того, что надето на oPC rolleyes.gif так как нам поставлена задача уничтожить все , что есть в сундуке, то, очевидно это не подойдет
Цитата
пришла идея ловить все предметы пошагово
object GetFirstItemInInventory(object oTarget=OBJECT_SELF);

object GetNextItemInInventory(object oTarget=OBJECT_SELF);

//собственно само уничтожение предметов DestroyObject


а вот это уже шаг в правильном направлении biggrin.gif особенно важна идея, что это прийдеться делать
Цитата
пошагово

ведь мы заранее незнаем скольо всего навалено в сундук -
целая куча,
один предмет
или вообще он пустой
то Artlira
Цитата
Не совсем понятно на какой слот надо будет ставить этот скрипт, на OnHeartbeat или OnUsed?

очевидно, что логически скрипт уничтожения ставить на OnClose сундука - ведь это очень логично : подходит к сундуку уничтожения игрок, открывает его, выкладывает в сундук все, что ему не понадобиться и закривает сундук( и при этом уничтожает мусор)
Цитата
1. Обозначить сам сундук как объект (oChest)
object oChest = GetObjectByTag("Sunduc_1") с заданным тагом


так как сундук в данном случае у нас "рабочий инструмент " и скрипт будет на его слоте , то он и являеться тем обьектом по умолчанию (OBJECT_SELF), то правильно будет
object oChest = OBJECT_SELF;

п.с. очевидно мы сЛексом пишем одновременно о одних и тех же вешах biggrin.gif

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

пока писал пост завис и надо было повторить sad.gif ...продолжаю

Цитата
2. Обозначить любой предмет, как предмет лежащий в этом сундуке
object oItem = GetFirstItemInInventory(oChest) ?

здесь мы оперделяем oItem не как любой предмет, но именно как первый предмет в инвенторе
но сама идея так делать совершенно правильная good.gif
Цитата
3. Проверять 1 действием скрипта пустой ли сундук, если пустой, то должен быть выход из скрипта?

да ,это следует проверить
кстати,Лекс уже подсказал вам как проверить пустой ли инвентарь
Цитата
подсказка: проверка пустоты - инвалидность (OBJECT_INVALID, GetIsObjectValid) очередного взятого предмета (GetNextItemInInventory).
Инвалидный - несуществующий или неправильно заданный объект. Скажем мы пытаемся найти в модуле объект с тэгом "LEX", а такого объекта там нет.

Цитата
4. 2 действием проверить - есть ли в инвентаре сундука любой предмет (oItem), не знаю нужно ли в этом случае проверять кем положен? По условиям скрипта (уничтожение любого предмета) это вроде не требуется?

а зачем еще раз что то проверять?
в пункте 2 вы определил, что oItem являеться первым в инвентаре сундука, а выполнив правильно пункт 3 мы убедились, что сундук непустой и , значит такой первый предмет в инвентаре существует( а если при проверке
установили, что инвентарь пуст то уже вышли( закончили выполнение скрипта))

Цитата
5. Если такой предмет найден, он должен быть уничтожен.
DestroyObject(oItem) ? и снова выход из скрипта.

функция найдена правильно, но зачем выходить из скрипта-ведь предметов может быть больше чем 1! а нам надо уничтожить все вещи...

как я уже писал выше главная идея этого скрипта в том, что мы будем выполнять действия пошагово( что и выявил Griffon good.gif ) и одни и те же действия будем повторять НЕСКОЛЬКО раз

такое действие называеться циклом

циклы бывают двух типов
1) те, в которых известно точное количество повторений
2) те ,которые выполняют одни и те же действия ПОКА выполнено какое то условие

как выдумайте, какой вид повторения нам нужен (и обоснуйте почему)?

Автор: Lex Oct 10 2007, 09:40

Может не стоит пока циклы? smile.gif

Автор: mamuc Oct 10 2007, 09:47

Цитата
Может не стоит пока циклы?

стоит - это ведь несложно, главное сам пинцып повторения понять..
и кстати,а как ты очищение инвентаря сделаешь без цыкла biggrin.gif

Автор: Lex Oct 10 2007, 11:00

Цитата(mamuc @ Oct 10 2007, 10:47) *
и кстати,а как ты очищение инвентаря сделаешь без цыкла

поэтому я и предложил остановиться.

зы: а я кстати знаю как без цикла это сделать, причем 2 способами. А ты? smile.gif

Автор: mamuc Oct 10 2007, 12:13

Цитата
а я кстати знаю как без цикла это сделать, причем 2 способами

и без подключения инклюда тоже? biggrin.gif

Автор: Lex Oct 10 2007, 12:26

Цитата(mamuc @ Oct 10 2007, 13:13) *
и без подключения инклюда тоже?

само собой smile.gif
- через UnAcquire с проверкой хозяина нового предмета (кстати до этого способа дошел Гриф тут немного выше)
- через disturb сундука
в обоих случаях предмет будет удаляться сразу как только окажется в сундуке (что является минусом данных методов, тк игрок может по ошибке положить не тот предмет и тю-тю). Но этот минус больше геймдизайнерский, а не скриптовый, так что в нашем случае роли не играет biggrin.gif
И всетаки думаю циклы пока рано. Ты бы уж тады по подробнее сначала на условиях остановился, а так же на &&. ||, !

Автор: mamuc Oct 10 2007, 12:37

а условие у нас и так само собой появиться - ведь по умному следует перед циклом проверить , не пустой ли сундук - тогда и дальше ничего делать не надо biggrin.gif




Добавлено через 1 минуту 30

а вот &&. ||, ! в начале не нужно - это уже более "развитая" тема

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

Автор: Lex Oct 10 2007, 13:02

Цитата(mamuc @ Oct 10 2007, 13:37) *
"через UnAcquire с проверкой хозяина нового предмета " как я уже писал выше,так можно удалить только то что надето на чара, а не то, что он носит у себя в инвентории biggrin.gif

ты чего-то путаешь smile.gif unacquire, а не unequip.

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

Цитата(mamuc @ Oct 10 2007, 13:37) *
! в начале не нужно - это уже более "развитая" тема

нуну, а условие выхода из цикла !GetIsObjectValid ты тоже без объяснения ! будешь давать? Лучше последовательно, циклы - не тот материал, с которого стоит начинать.

зы: и эта.. мы увлеклись smile.gif я потом тут почищу малек, а ты лучше начни толкать условия. Там мало 2х строк будет smile.gif

Добавлено через 5 минут

Цитата(mamuc @ Oct 10 2007, 13:37) *
а условие у нас и так само собой появиться - ведь по умному следует перед циклом проверить , не пустой ли сундук - тогда и дальше ничего делать не надо

по умному - строить цикл так, чтобы проверка валидности была частью цикла и работала для 1 предмета тоже (те банально делать в данном случае цикл с пред-условием while) А уж никак не писать отдельную проверку валидности для первого предмета rolleyes.gif

Автор: mamuc Oct 10 2007, 13:14

Цитата
ты чего-то путаешь unacquire, а не unequip.

уупс ...точно попутал scratch_one-s_head.gif
Цитата
нуну, а условие выхода из цикла !GetIsObjectValid ты тоже без объяснения ! будешь давать?

а это условие можно ведь и без ! написать biggrin.gif
"// * Returns TRUE if oObject is a valid object.
int GetIsObjectValid(object oObject)"

Цитата
ты лучше начни толкать условия

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

Цитата
по умному - строить цикл так, чтобы проверка валидности была частью цикла и работала для 1 предмета тоже (те банально делать в данном случае цикл с пред-условием while) А уж никак не писать отдельную проверку валидности для первого предмета

ток это уже по развито-умному..хотя ты прав лучше сразу так biggrin.gif

да надо будет эту дискусию подчистить - она не есть обучение, а о том что и каким порядком учить

Автор: Griffon Oct 10 2007, 15:32

mamuc,

Цитата(mamuc @ Oct 10 2007, 10:25) *
Цитата
void main()
{
object oPC = GetPCItemLastEquippedBy();
object oItem = GetPCItemLastEquipped();

//собственно само уничтожение DestroyObject
}

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

а если добавить - object oItem = GetPCItemMovedTo()?

Хотя, не проверял есть ли - GetPCItemMovedTo, т.е. что хочу сказать - добавить проверку перемещен ли предмет от игрока (MovedFrom) в сундук (MovedTo).

Добавлено через 17 минут 57 секунд

P.S. Нашел вот такие функции:

Neverwinter Script Source
// Get the possessor of oItem
// * Return value on error: OBJECT_INVALID
object GetItemPossessor(object oItem);


Neverwinter Script Source
// Use this in an OnItemLost script to get the item that was lost/dropped.
// * Returns OBJECT_INVALID if the module is not valid.
object GetModuleItemLost();


Neverwinter Script Source
// Use this in an OnItemLost script to get the creature that lost the item.
// * Returns OBJECT_INVALID if the module is not valid.
object GetModuleItemLostBy();

Автор: Artlira Oct 10 2007, 15:36

Цитата
беда в том, что это - первый предмет в сундуке. Так как удаление происходит с задержкой, то предложенный вариант (удаляем первый, значит первым становится другой, его тож удаляем и тд) не получается.

Цитата
в целом что-то есть, но не достаточно детализированно. Скажем не очень понятно, как твои 4 пункта сработают если в сундуке 5 предметов.

Может быть, можно обозначить пустой сундук как некое условие остановки скрипта? И удалять вкруговую, пока все предметы, лежащие в сундуке не закончатся? И когда первым предметом – станет “пустота” – и будет выход из скрипта?
Цитата
такое действие называеться циклом

циклы бывают двух типов
1) те, в которых известно точное количество повторений
2) те ,которые выполняют одни и те же действия ПОКА выполнено какое то условие

как выдумайте, какой вид повторения нам нужен (и обоснуйте почему)?

Слово цикл у меня вызывает панический ужас…
Кажется это через функцию while? и int(ы)? В случае с сундуком, скорее всего вариант 2, так как действие одно и то же – удаление предмета? А условие – это пустой сундук?

Автор: Lex Oct 10 2007, 16:12

Цитата(Artlira @ Oct 10 2007, 16:36) *
Может быть, можно обозначить пустой сундук как некое условие остановки скрипта? И удалять вкруговую, пока все предметы, лежащие в сундуке не закончатся? И когда первым предметом – станет “пустота” – и будет выход из скрипта?

суть именно "в круговую". И еще - не циклись на первом предмете, есть же еще следующий (GetNextItemInInventory)

Цитата(Artlira @ Oct 10 2007, 16:36) *
Слово цикл у меня вызывает панический ужас…

не надо бояться, штука на самом деле очень удобная.
Цитата(Artlira @ Oct 10 2007, 16:36) *
Кажется это через функцию while? и int(ы)? В случае с сундуком, скорее всего вариант 2, так как действие одно и то же – удаление предмета? А условие – это пустой сундук?

да.

Автор: mamuc Oct 11 2007, 10:17

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

теперь нам из всего найденово надо отобрать нужное и собрать все в месте
и так отбираем из того что выяснили
1 строчка скрипта - определяем "рабочее тело" то есть обьект -сундук

Цитата
object oChest = OBJECT_SELF;

2 строчка скрипта - берем первый предмет из лежащих в сундуке
Цитата
object oItem = GetFirstItemInInventory(oChest);

3 строчка скрипта - уничтожаем выбранный обьект-итем
Цитата
DestroyObject(oItem);

4 строчка скритпа - выбираем следующий предмет из сундука
Цитата
GetNextItemInInventory(oChest);


тогда унас получился примерно такой скрипт
Neverwinter Script Source
void main()
{
    object oChest = OBJECT_SELF;
    object oItem = GetFirstItemInInventory(oChest);

    DestroyObject(oItem);
    GetNextItemInInventory(oChest);
}

если мы в тулсете поставим еще один сундук, напишем этот скрипт , обзовем его как нибудь и поставим на соответсвующий слот сундука, то он будет работать ..вообще...но выясниться , что за раз он будет уничтожать только один предмет положеный в сундук( можете проверить кстати declare.gif )

вроде чего то не хватает scratch_one-s_head.gif не правда ли...
ну а теперь посмотрим, что мы еще не использовали в скрипте из выясненного?

а еще у нас нет двух вещей
1) повторения действий, то есть цикла
2) проверки того уже сундук пустой или нет ( или говоря иначе есть ли нам следующий предмет, которого надо брать для уничтожения или нет)

поскольку мы люди хитрые, мы эти две вещи обьеденим в одно biggrin.gif
------------------------------------------------------------------------------------------------------------------------------------

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

продолжение следует

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

описание функции выглядит так
Цитата
// * Returns TRUE if oObject is a valid object.
int GetIsObjectValid(object oObject)


это означает, что функция GetIsObjectValid являеться одной из тех функций, которые дает логический ответ, и есть только два варианта логического ответа
1) TRUE - "утверждение истинно"
2) FALSE - "утверждение ложно"

что это будет означать в нашем случае? и как это применить?

напомню, что нам важно будет знать есть ли еще предмет в сундуке или нет
а это означает, что
1) проверять на существование( валидность) нам следует oItem
2) удолетворяющий ответ унас должен быть, что такой предмет существует(то есть , когда функция GetIsObjectValid скажет гут - TRUE biggrin.gif )

в итоге мы можем написать такое УСЛОВИЕ
GetIsObjectValid (oItem) == TRUE
---------------------------------------------------


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

ну а теперь нам осталась вспомнить о циклах
Artlira , несмотря на боязнь слова "цикл", совершенно точно определила тип цикла (циклы,выполняют одни и те же действия ПОКА выполнено какое то условие)- ведь мы не знаем, сколько предметов положено в сундук
и даже написала его оператор( не функцию-кроме функций в языке скриптов есть еще и другие составные части) while good.gif
Цитата
Кажется это через функцию while



общий вид цикла с неизвестным числом повторений таков
Цитата
while (<УСЛОВИЕ>)
{
// здесь пишуться те строки скрипта ,
// которые следует выполнять, пока истинно услови

}


теперь вызнаете достаточно, что бы сделать изменения в скрипте, что написан выше..сделайте это самостоятельно declare.gif

Автор: Artlira Oct 11 2007, 10:58

Цитата
суть именно "в круговую". И еще - не циклись на первом предмете, есть же еще следующий (GetNextItemInInventory)

Честное слово сама дошла то такого же скрипта как mamuc написал, просто добавила после дестроя итема еще и определение следующего. Мысли были такие: если скрипт удалит первый заданный oItem, то, увидев, что следующий объект (GetNextItemInInventory) определен также(oItem), должен его автоматом удалить - у него же команда(DestroyObject(oItem)) на удаление всего что есть oItem.

Цитата
теперь вызнаете достаточно, что бы сделать изменения в скрипте, что написан выше..сделайте это самостоятельно


Не знаю правильно или нет, попыталась составить, но вот что получилось:
[ OFFTOP ]

Neverwinter Script Source
void[/spoiler] main()
{
  [color=blue]object oChest = OBJECT_SELF;
  object oItem = GetFirstItemInInventory(oChest);

while (GetIsObjectValid (oItem))
{
if (GetIsObjectValid (oItem)==TRUE)
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oChest);
  }
}


Автор: Lex Oct 11 2007, 11:23

Цитата(Artlira @ Oct 11 2007, 11:58) *
if (GetIsObjectValid (oItem)==TRUE)
DestroyObject(oItem);

лишнее. У тебя проверка валидности есть в цикле, зачем тебе ее еще раз делать внутри?
Цикл работает очень просто - условие правдиво? тогда выполняем то, что внутри цикла. Внутри у нас удаление и выбор следующего предмета. Условие же - проверка валидности предмета. Понятно же, что внутрь цикла мы попадаем только если предмет валиден, а значит еще 1 проверка валидности там не нужна, только удаление.

а так все верно, как по учебнику.

Давайте чтобы не обламывать другим кайф от написания скрипта самостоятельно, прятать скрипты под спойлер (правда у нас странный спойлер.. для наших нужд больше подходит тэг офф-топ)
вот так:
Код
[offtop][nss]
скрипт
[/nss][/offtop]

В итоге выглядеть оно будет вот так:
[ OFFTOP ]
Neverwinter Script Source
скрипт


Автор: mamuc Oct 11 2007, 11:43

то Artlira
good.gif только одна маленькая ошибка(даже не ошибка а лишнее - хотя скрипт будет работать и с ней, если добавить пару откривающую+закрвающую скобку для if )- условие if (GetIsObjectValid (oItem)==TRUE) совершенно лишнее, потому что мы это уже один раз проверили в "голове" цикла while (GetIsObjectValid (oItem))


вот так будет оптимальнее

[ OFFTOP ]
Neverwinter Script Source
void main()
{
     object oChest[quote][quote] = OBJECT_SELF;
     object oItem = GetFirstItemInInventory(oChest);

    while (GetIsObjectValid (oItem))
   {
         DestroyObject(oItem);
         oItem = GetNextItemInInventory(oChest);
   }
}
]


п.с. у нас Лексом явно наблюдаются паралельные действия biggrin.gif

заметки на память

1)число открытых и закрытых скобок всегда должна совпадать
2)для лучшего чтения скриптов надо применять отсупы ( стандарт 4 симбола(пробелы))
3) любой оператор языка структурно выглядит так
-----------------------------------------------------------------------------------------
<оператор> (<необходимые параметры, если таковы нужны>)
{ //обязательная открывающая скобка

// различные действия в том числе и функции и другие операторы

} //обязательная закрывающая скобка
------------------------------------------------------------------------------------------
4 ) записи условия GetIsObjectValid (oItem) == TRUE и GetIsObjectValid (oItem)
работают идентично, но второе короче потому, что в нем используються некоторые фичи - особенности скриптования

Автор: Lex Oct 13 2007, 17:27

Цитата(Griffon @ Oct 9 2007, 22:24) *
функцию худо бедно я могу найти

проверим ваши способности на поиск функций по описаниям.

Какая функция....
1. .. определяет, кто последний взял/положил/украл из плейсебла предмет?
2. .. определяет значение какой-либо характеристики у существа? (сила, ловкость, телосложение)
3. .. определяет убийцу НПС?
4. .. изменяет количество атак у существа?
5. .. берет первое существо в некой сфере (или другой фигуре), с указанным центром и радиусом?
6. .. делает НПС враждебным?
7. .. дает предмету некое свойство?
8. .. дает эффект нивидимости?
9. .. открывает локацию на миникарте?
10. .. заставляет всплыть над НПС или объектом некий текст, указанный вами прямо в скрипте?

все ответы помещайте под тэг "оффтоп", чтобы не отвлекать тех, кто еще не нашел.

Автор: Vhall Oct 13 2007, 18:07

[ OFFTOP ]
QUOTE(Lex @ Oct 13 2007, 18:27) *
1. .. определяет, кто последний взял/положил/украл из плейсебла предмет?

GetLastUsedBy
QUOTE(Lex @ Oct 13 2007, 18:27) *
2. .. определяет значение какой-либо характеристики у существа? (сила, ловкость, телосложение)

GetAbilityScore
QUOTE(Lex @ Oct 13 2007, 18:27) *
3. .. определяет убийцу НПС?

GetLastKiller
QUOTE(Lex @ Oct 13 2007, 18:27) *
4. .. изменяет количество атак у существа?

EffectAttackIncrease
QUOTE(Lex @ Oct 13 2007, 18:27) *
5. .. берет первое существо в некой сфере (или другой фигуре), с указанным центром и радиусом?

GetNearestCreature? И еще что-то про радиус дописывается.
QUOTE(Lex @ Oct 13 2007, 18:27) *
6. .. делает НПС враждебным?

SetIsTemporaryEnemy?
QUOTE(Lex @ Oct 13 2007, 18:27) *
7. .. дает предмету некое свойство?

AddItemProperty
QUOTE(Lex @ Oct 13 2007, 18:27) *
8. .. дает эффект нивидимости?

EffectInvisibility
QUOTE(Lex @ Oct 13 2007, 18:27) *
9. .. открывает локацию на миникарте?

SetMapPinEnabled
QUOTE(Lex @ Oct 13 2007, 18:27) *
10. .. заставляет всплыть над НПС или объектом некий текст, указанный вами прямо в скрипте?

FloatingTextStringOnCreature

Автор: Lex Oct 13 2007, 18:45

Вал, 6 из 10 правильно smile.gif

Добавлено через 21 минуту 40

Чтобы не бояться скриптов, надо уметь их читать. Когда они становятся не страницей непонятной китайской грамоты, а осмысленным набором команд - считайте вы сделали важный шаг к тому, чтобы писать такое сами smile.gif Думаю 3х хватит. smile.gif

1.

Neverwinter Script Source
void main( )
{
object oWolf = GetObjectByTag( "WONC_WOLF" );
object oPoint1 = GetNearestObjectByTag( "WP_FOREST_1" );
object oPoint2 = GetNearestObjectByTag( "WP_FOREST_2" );
object oEx;
if ( Random( 10 )<=1 )
  {
  if ( Random( 2 )==1 )
      {
      oEx = CopyObject( oWolf, GetLocation( oPoint1 ), OBJECT_INVALID, "WONC_WOLF_BK" );
      AssignCommand( oEx, ActionForceMoveToObject( oPoint2, Random( 2 ), 1.0, 20.0 ) );
      }
  else
      {
      oEx = CopyObject( oWolf, GetLocation( oPoint2 ), OBJECT_INVALID, "WONC_WOLF_BK" );
      AssignCommand( oEx, ActionForceMoveToObject( oPoint1, Random( 2 ), 1.0, 20.0 ) );
      }
  AssignCommand( oEx, ActionDoCommand( DestroyObject( oEx ) ) );
  }
}


2.
Neverwinter Script Source
void main( )
{
object oPC = GetPCSpeaker( );
object oF = GetNearestObjectByTag( "PLS_FIRE", oPC );
DelayCommand( 0.3, SetCommandable( FALSE, oPC ) );
AssignCommand( oPC, ActionMoveToObject( oF, FALSE, 0.0 ) );
AssignCommand( oPC, ActionDoCommand( SetFacingPoint( GetPosition( oF )) ));
AssignCommand( oPC, ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 1.0, 3.0 ) );
AssignCommand( oPC, ActionDoCommand( AssignCommand( oF, ActionPlayAnimation( ANIMATION_PLACEABLE_ACTIVATE ) ) );
AssignCommand( oPC, ActionDoCommand( SetCommandable( TRUE, oPC ) ) );
}


3.
Neverwinter Script Source
void main( )
{
FadeToBlack( OBJECT_SELF );
DelayCommand( 1.0, SetTime( GetTimeHour( )+1, GetTimeMinute( ), GetTimeSecond( ), GetTimeMillisecon( ) ) );
DelayCommand( 2.0, FadeFromBlack( OBJECT_SELF ) );
}


cобсно задание простое. Описать что делает скрипт, где он скорее всего стоит и вообще чего хотел афтор smile.gif

Автор: shadowdweller Oct 13 2007, 20:10

[ OFFTOP ]

1. .. определяет, кто последний взял/положил/украл из плейсебла предмет? - GetLastDisturbed
2. .. определяет значение какой-либо характеристики у существа? (сила, ловкость, телосложение) - GetAbilityModifier
3. .. определяет убийцу НПС? - GetLastKiller
4. .. изменяет количество атак у существа? - SetBaseAttackBonus
5. .. берет первое существо в некой сфере (или другой фигуре), с указанным центром и радиусом? - GetFirstObjectInShape
6. .. делает НПС враждебным? - AdjustReputation
7. .. дает предмету некое свойство? - AddItemProperty
8. .. дает эффект нивидимости? - EffectInvisibility
9. .. открывает локацию на миникарте? - ExploreAreaForPlayer
10. .. заставляет всплыть над НПС или объектом некий текст, указанный вами прямо в скрипте? - FloatingTextStringOnCreature

Автор: Lex Oct 13 2007, 20:33

shadowdweller, 1 неправильное.

Автор: shadowdweller Oct 13 2007, 20:59

Эх, если бы еще уметь пользоваться всеми этими функциями!
Теперь попробую со скриптами.

[ OFFTOP ]
1. Мне кажется, может стоять на триггере. Срабатывает в одном случае из 10, в одном случае, когда скрипт все-таки срабатывает, существо (волк?) пробегает из точки 1 в точку 2, а во втором - из точки 2 в точку 1. Потом исчезает.
2. *Тут будет не совсем честно, потому что кое-что Лекс подсказал* Сработает на ActionTaken ветки диалога. Своеобразная мини-катсцена, т.к. игрок не может в это время контролировать своего персонажа. Находим ближайший к РС объект с заданным тегом. Заставляем РС приблизиться к нему, проиграть анимацию (разжечь огонь?), после чего срабатывает эффект, и персонажем можно опять управлять.
3. Как мне кажется, этот скрипт может стоять и на триггере, и на диалоге, и на входе в локацию (последний вариант несколько сомнителен, но чисто теоретически - да). Здесь просто затемняется экран (на 2 секунды) на один час сдвигается время, т.е. как бы проходит час с момента какого-то события.

Автор: Artlira Oct 19 2007, 12:05

Цитата
cобсно задание простое. Описать что делает скрипт, где он скорее всего стоит и вообще чего хотел афтор


Увы, понятно мало...
[ OFFTOP ]
1. По определению объекта и вейпов вроде все понятно. Объект с определенным тэгом и ближайшие вейпы (1 и2).
Не понятно сокращение object oEx;
Дальше задано условие выполнение скрипта, случайность?
Получается, если выпадет случайным образом 1 вариант, то волк копируется на локацию 1 вейпа идет на второй и там дестроится?

Если вариант 2, то тот же волк копируется на локацию 2 вейпа и идет на 1 и дестроится на локации 1 вейпа.

Стоять этот скрипт может и на входе в локацию, и на триггере и возможно в диалоге, что-то вроде неуловимого волка?
“Ага, попробуй его излови…”
“Вот он! Ату его!!!” (скрипт)
“Эээх… Убег…”
У меня вопрос, а как работает CopyObject()? Это точная копия какого-то объекта, который уже есть где-то в модуле? При копировании, сам объект остается или переносится тоже?

2. Этот скрипт скорее всего запускается с диалога, может быть с диалога плейса?
DelayCommand( 0.3, SetCommandable( FALSE, oPC ) ); - заблокировать героя?
Дальше игрок должен подойти к какому-то объекту,
AssignCommand( oPC, ActionDoCommand( SetFacingPoint( GetPosition( oF )) )); - не понятно это действие…
Потом анимация разблокирования ловушки игроком, вполне может подойти для любого действия с объектом на земле. Активация плейса, возможно что-то включили, зажгли?
AssignCommand( oPC, ActionDoCommand( SetCommandable( TRUE, oPC ) ) ); - разблокировать игрока?

3. С этим скриптом не разобралась… Понятно что речь о времени и черном экране, но вот зачем и почему, не понятно.

Автор: mamuc Oct 19 2007, 12:48

у нас была небольшая пауза во время которой вы могли поучиться у Айвана

есть мнение( мое biggrin.gif ) что нам следует попытаться сделать что-то побольше и заодно освоить несколько важных понятий и умений

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

подготовка :
вариант реализации будет упрощенным - на одной и той же локе и без посторонних монстров и НПЦ( реально бутылочка в модуле длжна быть заныкана где-нить далеко-далеок и еще охраняться минотавром со своими дружбанами) то есть предпологаеться, что игрок задание уже получил
у нас уже есть лока с двумя сундуками, на эту локу мы поместим еще два юзабельных плейса - занычку (можно любой плейс-например телегу) и в противоположном углу алтарь Диониса, кроме того мы сделаем в тулсете один кустомный итем - бутылку напитка "божья роса"( с тегом\ресрефом it_botle_stq1) и положим эту бутылку
1) в занычку
2) в сундук, который при закрывании дает золото...

теперь нам надо весь процесс квеста отскриптовать, но сначало надо определить для самих себя какие скрипты( с какими действиями) на какие слоты каких плейсов надо поставить - то есть все надо описать словами и , желательно по пунктам : 1) 2) 3)

п.с. ( до свидания до понедельника biggrin.gif )

Автор: Artlira Oct 29 2007, 04:49

Цитата
теперь нам надо весь процесс квеста отскриптовать, но сначало надо определить для самих себя какие скрипты( с какими действиями) на какие слоты каких плейсов надо поставить - то есть все надо описать словами и , желательно по пунктам : 1) 2) 3)


Мне не совсем понятно по этому квесту, как надо учитывать два одинаковых предмета? Или у них должны быть разные таги (это понятно, но противоречит условию задания), или каким-то образом надо проверять, откуда взята данная бутылка (это совсем не понятно… Как это можно сделать)?
На алтаре скорее всего надо будет писать скрипт для слота OnDisturbed?
1. Определить игрока, как GetFirstPC()?
2. Предмет (oItem) определять через функцию - GetInventoryDisturbItem()?
3. Проверить таг предмета(через if ?), и если он будет равен заданному запускать основной скрипт:
Которым нужно:
1. Удалить сам предмет (бутылку) DestroyObject(oItem)?
2. Снять с игрока все вещи, это через слоты? То есть проверять каждый INVENTORY_SLOT_...? Или еще как-то?
3. Проверить характеристики игрока? Не понятно, как быть, если больше 15 будет ни одна, а например две характеристики? Тогда какую повышать?
4. Повысить характеристику, ну и дать что там еще причитается, (экспу, деньги и так далее) и запись в журнале о выполнении квеста.
Наверно как-то так?

Автор: Lex Oct 29 2007, 09:37

Цитата(Artlira @ Oct 29 2007, 04:49) *
Мне не совсем понятно по этому квесту, как надо учитывать два одинаковых предмета? Или у них должны быть разные таги (это понятно, но противоречит условию задания),

не противоречит. Квестовым предметам можно и нужно давать уникальные тэги. (кроме случаев, когда по квесту надо скажем принести 10 обычных предметов, например волчьих шкур.)
Цитата(Artlira @ Oct 29 2007, 04:49) *
или каким-то образом надо проверять, откуда взята данная бутылка (это совсем не понятно… Как это можно сделать)?

это проверять не нужно. Если предмет уникальный (с уникальным тэгом и все такое) - он должен быть в модуле 1 и взять его можно будет только оттуда, откуда надо. Если предмет не уникальный (см выше про шкуры) то не проверяется, откуда они взялись. Вполне можно купить шкуры и выполнить задание. (пресловутая свобода smile.gif )


Цитата(Artlira @ Oct 29 2007, 04:49) *
1. Определить игрока, как GetFirstPC()?

можно GetLastDisrurbed(). Если модуль 100% только сингловый - можно и GetFirstPC(). Но считается хорошим тоном как можно меньше использовать GetFirstPC() с тем, чтобы при желании можно было чутка доработать модуль для мультиплеерного прохождения.
Цитата(Artlira @ Oct 29 2007, 04:49) *
2. Снять с игрока все вещи, это через слоты? То есть проверять каждый INVENTORY_SLOT_...? Или еще как-то?

циклом. (эти константы на самом деле числа от 0 до 17, так что вместо того, чтобы проверять все, проще запустить цикл smile.gif )
Цитата(Artlira @ Oct 29 2007, 04:49) *
3. Проверить характеристики игрока? Не понятно, как быть, если больше 15 будет ни одна, а например две характеристики? Тогда какую повышать?

ошибка в ТЗ квеста. Имхо - повышать самую большую характеристику. Если их 2 - любую из них smile.gif

Автор: mamuc Oct 29 2007, 10:11

Lex я дал такое задание и потому , что оно ЕСТЕСТВЕННО должно породить вопросы по определенным не совсем понятным вещам и тому, как их "разрулить" ( способность к такого рода анализу настолько же важна, как и сама реализация скриптом- то есть без одного не сделать другово)

а по этому
1) никто не говорил, что модуль сингловый( это вполне может быть и в шарде-такое надо учитывать)
2) никто не говорил, что у правильной бутылки будет уникальный ресреф( это Лех от себя добаввил не вникнув в условия создания квеста-ведь я ясно указал, что есть по крайней мере ДВЕ такие бутылки( в заначке у минотавра и еще одном сундуке, а Дионисию надо вернуть именно ту, которую у него украли ( и которая сейчас находиться в заначке))
3) задача на повышение характеристики специально так и была сформулирована( это не ошибка ТЗ declare.gif ), что бы возник вопрос : а что делать, если такие характеристики двое или больше
(я рад , что вы это "раскусили" - в разработке и отскриптовании реального квеста ( или скрипта) иногда возникают "нештатные ситуации" на подобие этой - способность отыскать такие "узкие места" являеться очень важной для разработчика- ведь квест( и любая другая скриптовая система) пишеться, что бы он сработал всегда, при любых вариантах действия игрока, а не только для одного правильного образа выполнения)

Цитата
Определить игрока, как GetFirstPC()?

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

Автор: shadowdweller Oct 30 2007, 23:40

Решилась таки тоже ответить. ph34r.gif
В принципе, тут можно пойти по пути наименьшего сопротивления и сделать два скрипта:
1) Скрипт на сундук, который при закрывании дает золото.
Ставится OnClosed, при этом каждый раз в сундуке создается определенное количество золота. Для этого понадобится функция

Код
CreateItemOnObject("nw_it_gold001", OBJECT_SELF, 5);
где
"nw_it_gold001" - резреф (шаблон) создаваемого предмета,
OBJECT_SELF - объект, в инвентаре которого создается предмет, и
5 - количество предметов, которое будет создаваться. В общем-то, это и весь скрипт, он несложный.
Neverwinter Script Source
void main( )
{
CreateItemOnObject( "nw_it_gold001", OBJECT_SELF, 5 );
}

Хотя, мне кажется, я что-то пропустила и такой скрипт уже был??

2) Со вторым будет сложнее. Во-первых, нам понадобится условие
Neverwinter Script Source
if ( GetItemPossessor( GetObjectByTag( "it_botle_stq1" ) ) = OBJECT_SELF ) // Дальше пойдет цикл - надо раздеть РС и переложить предметы в инвентарь ( мы ж не звери, чобы для вознаграждения уничтожать все, что надето на игроке : ) )

object oItem = GetFirstItemInInventory( oEnter ); 
    while ( GetIsObjectValid( oItem ) )
   
    int nSlot;
    for ( nSlot = 0; nSlot < NUM_INVENTORY_SLOTS; nSlot++ )
    {
          oItem = GetItemInSlot( nSlot, oEnter );
          ActionUnequipItem( oItem );
    }

А вот дальше будет намного сложнее, поэтому куски скритов постить не буду. Наверное, дальше нам понадобится задать интеджер ( назовем int iChar, например), чтобы определить, какие же именно основные характеристики у РС больше 15.
Потом надо будет просмотреть все характеристики РС при помощи цикла (вот не знаю только, какого) и функции GetAbilityScore, и задать SetAbilityScore (iChar+1).
Ну, тут еще необходимо или задать в начале скрипта то, что он срабатывает один раз, или просто удалить с алтаря искомый объект - бутылку с "божьей росой", и повесить над алтарем спецэффект какой-нибудь, дабы у РС не возникло искушение прокачивать на халяву все эти характеристики бесконечно
Это просто
Neverwinter Script Source
DestroyObject( GetObjectByTag( "it_botle_stq1" ) );
// И, например, окружим алтарь световым кругом.
CreateObject( OBJECT_TYPE_PLACEABLE, "plc_solblue", location lLocation )

Только для этого нам нужно задать под алтарем вейпойнт и определить его как ту самую локацию (location lLocation), на которой будет создаваться плейсебл-эффект.
Немного сумбурно и здорово намудрила, конечно... snoozer_17.gif

ЗЫ: Lex, а где проверка д/з по описанию скриптов?

Автор: Lex Oct 31 2007, 09:21

Цитата(shadowdweller @ Oct 30 2007, 23:40) *
ЗЫ: Lex, а где проверка д/з по описанию скриптов

? я прокомментировал все ответы по этому заданию, что появились в теме.. или кого-то пропустил?
Цитата(mamuc @ Oct 29 2007, 10:11) *
Lex я дал такое задание и потому , ...

лана, лана, я ваще молчу ph34r.gif рули

Автор: Artlira Oct 31 2007, 09:37

Цитата
Квестовым предметам можно и нужно давать уникальные тэги. (кроме случаев, когда по квесту надо скажем принести 10 обычных предметов, например волчьих шкур.)


Это все мне понятно, но дело в том, что в условии задания:

Цитата
мы сделаем в тулсете один кустомный итем - бутылку напитка "божья роса"( с тегом\ресрефом it_botle_stq1) и положим эту бутылку
1) в занычку
2) в сундук, который при закрывании дает золото...


Вот… Я, поэтому и спрашиваю, как проверить какой из двух предметов “настоящий”, если они оба имеют один и тот же тэг? И наверно еще такой вопрос, а почему нельзя сделать этим бутылкам разные тэги?

Я не знаю, с какой стороны подходить к скрипту на алтаре. Мне непонятно какое условие задавать, что бы он сработал…

Автор: mamuc Oct 31 2007, 10:25

Цитата
) Скрипт на сундук, который при закрывании дает золото.
Ставится OnClosed, при этом каждый раз в сундуке создается определенное количество золота. Для этого понадобится функция

Код
CreateItemOnObject("nw_it_gold001", OBJECT_SELF, 5);
где
"nw_it_gold001" - резреф (шаблон) создаваемого предмета,
OBJECT_SELF - объект, в инвентаре которого создается предмет, и
5 - количество предметов, которое будет создаваться. В общем-то, это и весь скрипт, он несложный.

Neverwinter Script Source
void main( )
{
CreateItemOnObject( "nw_it_gold001", OBJECT_SELF, 5 );
}

Хотя, мне кажется, я что-то пропустила и такой скрипт уже был??

rolleyes.gif ммм ... внимательно читаем задание
Цитата
подготовка :
вариант реализации будет упрощенным - на одной и той же локе и без посторонних монстров и НПЦ( реально бутылочка в модуле длжна быть заныкана где-нить далеко-далеок и еще охраняться минотавром со своими дружбанами) то есть предпологаеться, что игрок задание уже получил
у нас уже есть лока с двумя сундуками, на эту локу мы поместим еще два юзабельных плейса - занычку (можно любой плейс-например телегу) и в противоположном углу алтарь Диониса, кроме того мы сделаем в тулсете один кустомный итем - бутылку напитка "божья роса"( с тегом\ресрефом it_botle_stq1) и положим эту бутылку
1) в занычку
2) в сундук, который при закрывании дает золото...

сие означает, что в процессе подготовки к квесту открываеться тулсет, в тулсете открываеться соответствующая(и наша пока единственная ) лока и производиться кое какие действия, в том числе и : "сделаем в тулсете один кустомный итем - бутылку напитка "божья роса"( с тегом\ресрефом it_botle_stq1) и положим эту бутылку
1) в занычку
2) в сундук, который при закрывании дает золото...
"
то есть при подготовке бутылка создана и положена на место( точнее оба заданных места) в тулсете и это НЕ НАДО больше делать скриптом

чтобы легче было бы расписать что , где и когда что надо заскриптить мысленно представьте, что вы есть тот игрок который только что получил квест..( то есть вы знаете, что
1)у Дионисия сперли бутылку
2)бутылку свистнул минотавр( по словам Дионисия)
3) минотавр ее где-то спрятал
4) вы не знаете точно где бутылка спрятана
5) вам надо бутылку найти
6) найденую бутылку вам надо доставить к алтарю Дионисия )

а теперь опишите, что вы делаете, какие будет ваши действия как игрока ?

для удобства воспользуемся такой схематической картой
=================================А=
===================================
===================================
===================================
===================================
========С1=========================
===================================
===============И===================
===================================
=======================С2==========
===================================
===================================
===================================
===================================
=З=================================

обозначения: А-алтарь Дионисия,И - игрок, С1-сундук дающий деньги, С2 - сундук-уничтожитель вещей, З - заначка минотавра


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

Цитата
И наверно еще такой вопрос, а почему нельзя сделать этим бутылкам разные тэги?

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

Цитата
Вот… Я, поэтому и спрашиваю, как проверить какой из двух предметов “настоящий”, если они оба имеют один и тот же тэг?

ага а вот тут мы вплотную подходим к одной из новых вещей, которые мы должны будем освоить biggrin.gif
этот способ называеться в просторечии"повесить локалку" - то есть на любой обьект можно добавить новую переменную и присвоить ей значение отличное от 0 - таким образом сделав этот предмет отличительным ( ведь у других обьектов такая переменная не присвоена-значит при проверке значения этой переменной мы будем получать 0(значение по умолчанию), а у нашего обьекта с "повешеной локалкой" оно не будет = 0)

Автор: Artlira Oct 31 2007, 10:26

Цитата
а теперь опишите, что вы делаете, какие будет ваши действия как игрока ?


Игрок, попав на такое поле, где есть сундуки, тачка и алтарь, первым делом все вскроет. Взяв первую же бутылку “Божья Роса”, потащит ее на алтарь.
Вот и все действия…
Но как я понимаю, каким-то образом игроку надо дать понять, что одна из бутылок – подстава. То есть кладет он ее на алтарь, а толку нет. Но вот как это сделать, если у бутылок одинаковые тэги мне и непонятно…

Цитата
ага а вот тут мы вплотную подходим к одной из новых вещей, которые мы должны будем освоить
этот способ называеться в просторечии"повесить локалку" - то есть на любой обьект можно добавить новую переменную и присвоить ей значение отличное от 0 - таким образом сделав этот предмет отличительным ( ведь у других обьектов такая переменная не присвоена-значит при проверке значения этой переменной мы будем получать 0(значение по умолчанию), а у нашего обьекта с "повешеной локалкой" оно не будет = 0)


То есть в тот момент как игрок берет предмет из заначки минотавра на него нужно повесить локалку?

Автор: Lex Oct 31 2007, 10:50

имхо, это очень надуманное и не реалистичное (по крайней мере мой опыт разработки квестов мне об этом говорит) ограничение про 2 бутылки с 1 тегом, а нужна тока одна. В таких случаях делают разные тэги.

Автор: mamuc Oct 31 2007, 10:55

Цитата
То есть в тот момент как игрок берет предмет из заначки минотавра на него нужно повесить локалку?

да ...и тогда эта локалка будет сигнализировать, что игрок взял бутылку из правильного места
Цитата
Но как я понимаю, каким-то образом игроку надо дать понять, что одна из бутылок – подстава. То есть кладет он ее на алтарь, а толку нет.

и ,если на игрока будет висеть правильная локалка, то мы будем знать откуда принес бутылку..
good.gif

Автор: Lex Oct 31 2007, 11:16

Цитата(mamuc @ Oct 31 2007, 10:55) *
и ,если на игрока будет висеть правильная локалка, то мы будем знать откуда принес бутылку..

правда остается мелкая дырка, если мы возьмем обе, а положим всетаки вторую, которая неправильная. Локалка то висит.

зы: локалку надо вешать не на игрока, а на предмет, тогда такой беды нету.

Автор: mamuc Oct 31 2007, 11:26

Цитата
имхо, это очень надуманное и не реалистичное (по крайней мере мой опыт разработки квестов мне об этом говорит) ограничение про 2 бутылки с 1 тегом, а нужна тока одна. В таких случаях делают разные тэги.

Лекс а почему ты думаешь, что вторая бутылка не нужна?..то, что она не нужна для выполнения этого конкретного квеста, отнюдь не означает, что она не нужна совсем...и, создавая свой квест, надо учитывать, что в это время может работать и другой квест с таким же предметом(здесь это бутылка"божьей росы") , как используешь ты...



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

Цитата
правда остается мелкая дырка, если мы возьмем обе, а положим всетаки вторую, которая неправильная. Локалка то висит.

рррр... кто-то( не будем показывать пальцами) пару постов выше обещал не вмешиваться...

то, что нужно не только повесить локалку на игрока ,но и "пометить" бутылку -эту идею должны были выявить сами обучающиеся САМОСТОЯТЕЛЬНО...

и так с помощью Лекса мы выяснили ситуацию, когда можно найти обе бутылки и положить потом на алтарь неправильную... и Лекс же подсказал путь решения - повесить локалку и на бутылку
здесь есть один нюанс - можно не вешать новую локалку, можно обойтись у же тем что имееться...а иметься у итема такая возможность изменить чарджи( это используеться в волшебных палочках, для ограничеия количества примененых заклинаний, но кто сказал, что мы не можем добавлять чарджи другим итемам biggrin.gif ( чарджи можно добавить до 50, давайте и выставим мах количество)

это делает функция
SetItemCharges(object oItem, int nCharges)

Автор: Lex Oct 31 2007, 11:59

Цитата(mamuc @ Oct 31 2007, 11:22) *
Лекс а почему ты думаешь, что вторая бутылка не нужна?..то, что она не нужна для выполнения этого конкретного квеста, отнюдь не означает, что она не нужна совсем...и, создавая свой квест, надо учитывать, что в это время может работать и другой квест с таким же предметом(здесь это бутылка"божьей росы") , как используешь ты...

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

Добавлено через 56 секунд

Цитата(mamuc @ Oct 31 2007, 11:26) *
о, что нужно не только повесить локалку на игрока

на игрока вообще не нужна, вообще то. Нагрузки на локалку нет.

Автор: mamuc Oct 31 2007, 12:13

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

неа легче все-таки развести различными чарджами(вспомни мое предложение про дюжину бутылок для Дионисия biggrin.gif )..но это мое ИМХО biggrin.gif


Цитата
на игрока вообще не нужна, вообще то. Нагрузки на локалку нет.

одно мааленькое замечание - в сингле действительно не нужно biggrin.gif а в шарде ведь можно бутылочку передать другому biggrin.gif

Автор: Lex Oct 31 2007, 12:41

Цитата(mamuc @ Oct 31 2007, 12:13) *
одно мааленькое замечание - в сингле действительно не нужно biggrin.gif а в шарде ведь можно бутылочку передать другому

в твоей формулироке квеста не важно, кто ее кладет на алтарь (бонус получает положивший бутылку, а не получивший и выполнивший задание игрок), значит не важна и передача другому игроку.

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

Цитата(mamuc @ Oct 31 2007, 11:26) *
здесь есть один нюанс - можно не вешать новую локалку, можно обойтись у же тем что имееться...а иметься у итема такая возможность изменить чарджи

омг! это анахронизм из СОУ wacko.gif . В ХОТУ и дальше уже есть локалки, нафига изобретать велосипед то? (а если сделать зелье реальным, те юзабельным со своим каким-то эффектом опьянения, там ваще будет 1 чарж, если я не ошибаюсь). Лучше как раз юзать локалки - они для этого и предназначены.

Автор: SvYaT Nov 26 2007, 22:01

Я впринципе в скрипте слаб. Частично научился только с вшими уроками. Есть мысли на счёт этой задачи.
Нужно создать 2 скрипта. 1 скрипт повесить на Сундук у минатавра а 2 скрипт повесить на Алтарь.
1 В сундуке Минатавра должна лежать бутылка, при открытие сундука на бутылку лежащую Имено в сундуке повесится локалка и на игрока тоже.(если игра мултиплайерная).
2 У алтаря проверять бутылку и игрока на соответствие локалки.

Столкнулся с проблеммой если 2-3 бутылки поместятся в один слот, локалка исчезает с бутылки и квест не проходится. Обоити можно если только Бутылка будет не бутылкой, например кольцом sad.gif
Кто подскажет как посадить NPC и чем отличны версии Toolset 1.0.1115.0 от 1.0.870.0.

Автор: SvYaT Nov 27 2007, 13:38

Вот скрипт для сундука у минатавра:

Neverwinter Script Source
void main( )
{   
    object oBarrel = OBJECT_SELF;
    object oPC = GetLastOpenedBy( );
    object oItem = GetItemPossessedBy( oBarrel, "VINO_DIONISIYA" );
   
    if ( GetIsObjectValid( oItem )==TRUE && GetLocalInt( oPC, "IGROK" )==0 )
    {
    SetLocalInt( oItem, "VINO", 1 );
    SetLocalInt( oPC, "IGROK", 1 );
    SendMessageToPC( oPC, "Скимпт сработал." );// Это для себя : )
    }
}


И скрипт для Алтаря:
Neverwinter Script Source
void main( )
{
    object oChes = OBJECT_SELF;
    object oPC = GetLastClosedBy( );
    object oItem = GetItemPossessedBy( oChes, "VINO_DIONISIYA" );
   
    if ( GetIsObjectValid( oItem )==TRUE && GetLocalInt( oItem, "VINO" )==1 && GetLocalInt( oPC, "IGROK" )==1 )
    {
    DestroyObject( oItem );
    SendMessageToPC( oPC, "Дионисий: Ура ты нашёл то вино которое украл этот подлый Минотавр!" );
    GiveGoldToCreature( oPC, 20000 );
    }
    if ( GetIsObjectValid( oItem )==TRUE && GetLocalInt( oItem, "VINO" )==0 && GetLocalInt( oPC, "IGROK" )==0 )
    {
    SendMessageToPC( oPC, "Дионисий: Это не та бутылка вина которую украл Минотавр, Хотя из той же партии." );
    }
    if ( GetIsObjectValid( oItem )==TRUE && GetLocalInt( oItem, "VINO" )==0 && GetLocalInt( oPC, "IGROK" )==1 )
    {
    SendMessageToPC( oPC, "Дионисий: Куда ты дел мою бутылку Вина Ришил утаить её от Меня? Быстро верни мне её." );
    }
}

Не судите строго.

Автор: mamuc Dec 9 2007, 15:48

Цитата
Столкнулся с проблеммой если 2-3 бутылки поместятся в один слот, локалка исчезает с бутылки и квест не проходится. Обоити можно если только Бутылка будет не бутылкой, например кольцом
впринцыпе эту проблему можно решить дав бутылке чардж( итемы с разными чарджами не складываються вместе)..правда тогда остаетьсчя вопрос о том если на бутылку делать из палитренной на которой уже висит сигл юз бутылку выпить..там надо проверять это дополнительно...

про скрипты : good.gif ..не будь слишком скромным- ты уже не такой слабак...ты можешь уже и разобрать достаточно непростую ситуацию и написать написать скрипты ее решающую .. а дальше только не останавливаться, ведь путь совершенствования себя никогда нек ончаеться... и завтра ты сможешь "разрулить" ситуацию, которую не смог вчера

про посадить на стул : на форуме есть примеры как это сделать и несколько вариантов ..все решаеться с ActionSit
вот пример скрипта садящего на стул ПЦ и снимающего оружие при этом
Neverwinter Script Source

void main( )
{
    object oPC = GetLastUsedBy( );
    object oChair = OBJECT_SELF;
    if ( GetIsPC( oPC ) )
    {
    if ( GetIsObjectValid( oChair ) && !GetIsObjectValid ( GetSittingCreature( oChair ) ) )
        {
        AssignCommand( oPC, ActionUnequipItem( GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC ) ) );
        AssignCommand( oPC, ActionUnequipItem( GetItemInSlot( INVENTORY_SLOT_LEFTHAND, oPC ) ) );
        AssignCommand( oPC, ActionSit( oChair ) );
        }
    }
}

есть 2 но...1) стул(пл ейс)на который хочешь посадить должен быть юзаюельным
2) если хочешь посадить на тайловый обьект, то сначало надо создать стул-невидимый обьект и сажать на него


и последнее..я сейчас буду некоторое время весьма занят, потому не смогу достаточно часто появляться здесь и соответсвенно быстро и оперативно вести занятия...поэтому давайте дружно попросим Лекса продолжить это нужное и полезное дело scout.gif

Лекс поможишь людям..ну пожалуйста biggrin.gif : hi.gif : yess.gif yess.gif biggrin.gif

Автор: Lex Dec 27 2007, 09:35

мамук редиска, но и я тож хорош.
В общем кому еще тут что-то интересно, просто скажите какую тему хотите разобрать. Ну например вы ваяете свой модуль и там есть скриптовая задача, к которой вы боитесь подступиться даже. Описывайте ее тады прям сюда, будем думать вместе (сначала вы выскажете что об этом всем думаете, потом я и сравним что получилось smile.gif )

зы: просто дело в том, что я сейчас плохо представляю какие у вас трудности и каково в данный момент понимание темы.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)