Помощь - Поиск - Пользователи - Календарь
Полная версия: Азы скриптинга NWN/NWN2. Внеклассные занятия
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights 2 Obsidian Toolset
Страницы: 1, 2
Neo
а это... можно спросить? blush.gif а что такое переменная? blush.gif
Aiwan
Переме́нная в традиционных языках программирования — поименованная ячейка памяти, имя которой можно использовать для осуществления доступа к данным, находящимся по данному адресу.
http://ru.wikipedia.org (с)
Vhall
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: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
Цитата
Интеджер 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
Цитата(mamuc @ Oct 8 2007, 10:26) *
маленькое уточнение целые числа - это не только натуральные

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

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

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

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

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

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

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

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

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

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


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


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

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

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

счастливо оставаться
Griffon
Хорош вам уже грызться 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
Цитата(mamuc @ Oct 9 2007, 12:19) *
то есть это мягое напоминамие ударом дубиной, что помщники тебе не нужны и ты только сам и один будешь все делать?

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

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
Цитата
object oUser = GetLastUsedBy() ;

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

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

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

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

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


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


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

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

object oItem = GetFirstItemInInventory(oChest);? Любой предмет нужно обозначить как предмет лежащий в этом сундуке, затем проверить есть этот объект или нет и если есть, его дестроить?
DestroyObject(oItem);
Griffon
Цитата(mamuc @ Oct 9 2007, 12:56) *
и еще одно уточнение - нам надо найти не вообще какого - то PC , а именно того PC который только что закрЫл сундук


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

правильно надо изменить определение обьекта 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
Цитата
а теперь найдите функцию с какой вы можете дать 1000 голдов игроку

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

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

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

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


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

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

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

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

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

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

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

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

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

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



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

тому игроку, который разговаривает в данном диалоге (из которого вызывается скрипт). Говорить в этот момент может и НПС, не обязательно игрок (те скрипт может стоять на фразе НПС)
Griffon
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
Цитата(Griffon @ Oct 9 2007, 19:34) *
пришла идея ловить все предметы пошагово

чет я шагов не вижу. Ты выделил только 2 предмета, а остальные? smile.gif
Griffon
Идея идиотская, конечно же. Поскольку придется вылавливать все что будет в ящике и пасать скрипт на проверку его пустоты (здесь я пас - идей нет). Лекс, ты же знаешь функцию худо бедно я могу найти или попытаться сам написать. Но остается самое главное для меня - код ее реализации!
Lex
Цитата(Griffon @ Oct 9 2007, 22:24) *
пасать скрипт на проверку его пустоты

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

если не можете написать сами скрипт, то опишите, как вы это предстваляете-какие действия для этого требуються выполнить по порядку 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
Цитата(Artlira @ Oct 10 2007, 05:14) *
2. Обозначить любой предмет, как предмет лежащий в этом сундуке
object oItem = GetFirstItemInInventory(oChest) ?

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

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

в целом что-то есть, но не достаточно детализированно. Скажем не очень понятно, как твои 4 пункта сработают если в сундуке 5 предметов.
mamuc
то 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
Может не стоит пока циклы? smile.gif
mamuc
Цитата
Может не стоит пока циклы?

стоит - это ведь несложно, главное сам пинцып повторения понять..
и кстати,а как ты очищение инвентаря сделаешь без цыкла biggrin.gif
Lex
Цитата(mamuc @ Oct 10 2007, 10:47) *
и кстати,а как ты очищение инвентаря сделаешь без цыкла

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

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

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

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




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

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

и еще одно замечание
"через UnAcquire с проверкой хозяина нового предмета " как я уже писал выше,так можно удалить только то что надето на чара, а не то, что он носит у себя в инвентории biggrin.gif
Lex
Цитата(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
Цитата
ты чего-то путаешь 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
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
Цитата
беда в том, что это - первый предмет в сундуке. Так как удаление происходит с задержкой, то предложенный вариант (удаляем первый, значит первым становится другой, его тож удаляем и тд) не получается.

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

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

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

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

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

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

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

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

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

теперь нам из всего найденово надо отобрать нужное и собрать все в месте
и так отбираем из того что выяснили
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
Цитата
суть именно "в круговую". И еще - не циклись на первом предмете, есть же еще следующий (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
Цитата(Artlira @ Oct 11 2007, 11:58) *
if (GetIsObjectValid (oItem)==TRUE)
DestroyObject(oItem);

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

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

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

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

mamuc
то 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
Цитата(Griffon @ Oct 9 2007, 22:24) *
функцию худо бедно я могу найти

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

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

все ответы помещайте под тэг "оффтоп", чтобы не отвлекать тех, кто еще не нашел.
Vhall
[ 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.