Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 136 137 138 139 140 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Ilerien
сообщение May 30 2011, 22:38
Сообщение #3416


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Цитата
перечитал описание CreateItemOnObject в Лексиконе, по тэгам можно вызывать только предметы стандартной палитры, почему собс-но золото и дается
Это де-факто неправда. (IMG:style_emoticons/kolobok_light/smile.gif) Просто в стандартной палитре соблюдена конвенция - дефолтный тег предмета совпадает с его ресрефом, но написан в верхнем регистре. Строка, передаваемая в CreateObject/CreateItemOnObject(), автоматически конвертируется в нижний регистр, поэтому и так и получается. Никто не мешает соблюдать ту же конвенцию в кастомной палитре.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение May 30 2011, 23:11
Сообщение #3417


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Исправил, работает, спасибо
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 3 2011, 15:22
Сообщение #3418


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Скрипт
Neverwinter Script
object GiveToChest(string str, int integer)
{
return CreateItemOnObject(str, OBJECT_SELF, integer, "");
}
object GetMundaneArmorByD100()
{
int i1 = d100(1);
int i2 = Random(9)+1;
int i3 = d100(1);

//   if(i1==1)
//   {
    return GiveToChest("ba13_"+IntToString(i2),1);
//   }
}
void MakeEnchMagicArmor(int Ench)
{
object oARMOR = GetMundaneArmorByD100();
string sNAME = GetName(oARMOR);
int i = GetStringLength(sNAME);
int n = FindSubString(sNAME, " мастерской работы");

while(i>=n)
{
  sNAME[i]=&#39;&#39;;
  i = i-1;
}
}

void main()
{
//int i1 = d100(1);
}

Выдает ошибку "NO SEMICOLON AFTER EXPRESSION"(нет точки с запятой после выражения) на строку "sNAME[i]='';". Пробовал вместо '' ставить "" или null, так же заменял
Neverwinter Script
while(i>=n)
{
  sNAME[i]=&#39;&#39;;
  i = i-1;
}

на
Neverwinter Script
while(n<=i)
{
  sNAME[n]=&#39;&#39;;
  n++;
}

все равно ругался
там, где
Neverwinter Script
&#39
было " ' " без пробелов

Сообщение отредактировал wirTUS - Jun 3 2011, 15:38
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Jun 3 2011, 15:45
Сообщение #3419


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



В нвскрипте нет массивов.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 3 2011, 18:25
Сообщение #3420


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



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

Решил порезать процедуру получения айтема, вставив ее в получение енча, соотв., куб кидается там же, соотв., по этому кубу сразу получается айтем, меняется имя и дается енч(пока еще не дается, но это не на долго). По идее, должно работать
Neverwinter Script
object GiveToChest(string str, int integer)
{
return CreateItemOnObject(str, OBJECT_SELF, integer, "");
}
//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////
}
void MakeEnchMagicArmor(int Ench)
{
object oARMOR;
int i1 = d100(1);
int i2 = Random(9)+1;

   if(i1==1)
   {
    oARMOR = GiveToChest("ba13_"+IntToString(i2),1);
    SetName(oARMOR, "+"+IntToSrting(Ench)+" Обитый доспех");
   }


}

void main()
{
//int i1 = d100(1);
}

Кстати, padded armor, переведенный как обитый доспех это нормально? Вроде у него в русском есть свое имя, на "б" что-то, кажется

Уже налипил лишнюю скобку и "srting" (IMG:style_emoticons/kolobok_light/prankster2.gif)

Цитата
Вроде у него в русском есть свое имя, на "б" что-то, кажется
Стеганка на "б" (IMG:style_emoticons/kolobok_light/biggrin.gif)

Сообщение отредактировал wirTUS - Jun 3 2011, 17:52
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Jun 3 2011, 22:44
Сообщение #3421


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Цитата
Т.е. отдельный символ строки получить нельзя, и, следовательно, строку нельзя уменьшить без полного изменения (приравнивания к меньшей строке)?
Да. GetSubString() в помощь.

Багов на первый вгляд нет.

Переводом названий итемов не заморачивался, на английском всяко лучше. (IMG:style_emoticons/kolobok_light/rolleyes.gif)

Сообщение отредактировал Ilerien - Jun 3 2011, 22:44
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 4 2011, 02:01
Сообщение #3422


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



А вот такой вопрос: что есть database и кастомный dialog.tlk, с чем их едят, в чем (и есть ли) преимущества кастомного "диалога" над стандартным?
Еще вопрос: можно ли для какого-нибудь feat'а, сделанного спеллом (как ярость варвара, например) сделать радиальное меню с выбором из n вариантов (как клик ПКМ на игрока)?
Если да, то
1)Как?
2)Можно ли сделать многоуровневое радиальное меню (как ПКМ на игрока - spells - wizard - VI)?
3)Можно ли, "достраивать" это меню по ходу игры (например, прошел игрок по триггеру и бац! в меню фита новый пункт)?

Сообщение отредактировал wirTUS - Jun 4 2011, 04:33
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Keks
сообщение Jun 4 2011, 10:12
Сообщение #3423


Level 3
*

Класс: Теневой Танцор
Характер: Lawful Neutral
Раса: Человек



1) database - папка игры, где содержаться данные о встроенной БД (да и сама БД тож);
2) кастомный dialog.tlk - основной тлк игры, содержит текст, который используется как в самой игре, палитрах, так и во всех менюшках запуска nwn.exe. Если вносить изменения в него, то необходимо "закинуть" измененный файл в корень игры и в папку тлк. Система кастомного диалога была разработана биоварями для шардов (разный шарды = разные тлк), в то время как дефолтный вносит изменение во все с момента запуска игры
3) Да можно.
3.1 ) Создать фит и выдать его чару/ сделать выборным через cls_feat_***.2da, в последнем столбце поставив "1" это отразит фит в радикальном меню класса.
3.2 ) Можно - смотри по аналогии с многоуровневыми заклинаниями (например шейпы перевертыша).
3.3 ) Да можно - выдавать фиты (правда я делал это с применением нвнх, отключенным дефолтным ЕЛЦ и соответственно включенным своим ЕЛЦ (IMG:style_emoticons/kolobok_light/wink3.gif) )

Сообщение отредактировал Keks - Jun 4 2011, 10:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Jun 4 2011, 10:46
Сообщение #3424


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



База данных в НВН бывает внутренней (стандартные средства вроде SetCampaignInt() и т. д.) и внешней (я пользуюсь MySQL, прикрученным через NWNX ODBC). Выгоды от использования очевидны - возможность сохранять информацию вне зависимости от рестартов сервера.

Измененный dialog.tlk используется, когда хочется изменить какие-то строки, не поддающиеся переписыванию через 2да (скажем, название урона), или если критично видеть при создании персонажа измененные описания классов/фитов/заклинаний/.. Использовать не рекомендуется - потому что эта замена для клиента распространяется на все. (IMG:style_emoticons/kolobok_light/smile.gif)
Кастомный tlk - это отдельный tlk-файл, который подключается непосредственно к модулю. Хорош всем, кроме того, что строки из него при создании персонажа и заходе на сервер не видны.
Цитата
Еще вопрос: можно ли для какого-нибудь feat'а, сделанного спеллом (как ярость варвара, например) сделать радиальное меню с выбором из n вариантов (как клик ПКМ на игрока)?
Если да, то
1)Как?
2)Можно ли сделать многоуровневое радиальное меню (как ПКМ на игрока - spells - wizard - VI)?
3)Можно ли, "достраивать" это меню по ходу игры (например, прошел игрок по триггеру и бац! в меню фита новый пункт)?
Можно.
1) Сделав целевое заклинание состоящим из подзаклинаний, как всяческие теневые вызывания. Там есть грабли, которые я не так давно описывал в окрестности этой темы - поиск в помощь.
2) Нет.
3) Нет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 4 2011, 12:35
Сообщение #3425


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Огромное спасибо
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 6 2011, 13:36
Сообщение #3426


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



А вот вопрос по NWNx: куда и как он девает бд, созданую скриптом (был поюзан скрипт из примера по odbc)? Поиском обшарил на pwdata весь компьютер, ничего не нашел
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Jun 6 2011, 13:54
Сообщение #3427


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Странный вопрос. Честно говоря, я не помню, как MySQL хранит данные на харде, но зачем это вообще понадобилось? Есть удобный интерфейс для доступа к данным, зачем их физически на харде отлавливать?
Сам мускуль-то поставил? Без него (ну или SQLite/Postgres - но с мускулем проще всего) этот плагин в принципе работать не будет.

Сообщение отредактировал Ilerien - Jun 6 2011, 14:23
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Jun 6 2011, 17:40
Сообщение #3428


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Там при распаковки NWNx в директорию игры по умолчанию стоит другой тип БД не MySQL, нужно в ручную за коментить в настройках NWNx ее и раскоментить MySQL. Может, в этом проблема?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 6 2011, 17:58
Сообщение #3429


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Я сначала попробовал в ацесс, в mysql попробовал создать скриптом из nwnx'овского демо модуля, на \u nonamedb (поменял в скрипте с pwdata на nonamedb) ругается ERROR 1049 <42000>: Unknown database 'nonamedb'. Предварительно создал nwnx'ом хост и зашел до вылета, скрипт должен был сработать
Цитата
Там при распаковки NWNx в директорию игры по умолчанию стоит другой тип БД не MySQL, нужно в ручную за коментить в настройках NWNx ее и раскоментить MySQL. Может, в этом проблема?
Понял, меняю
Цитата
Я сначала попробовал в ацесс, в mysql попробовал создать скриптом из nwnx'овского демо модуля, на \u nonamedb (поменял в скрипте с pwdata на nonamedb) ругается ERROR 1049 <42000>: Unknown database 'nonamedb'. Предварительно создал nwnx'ом хост и зашел до вылета, скрипт должен был сработать

Поставил настройки под mysql, скорее всего через скрипт получить доступ к БД получится, через mysql идет та же ошибка. С бд в принципе и mysql в частности до вчерашнего дня дела не имел, наверняка где-то тут кроется причина

Сообщение отредактировал wirTUS - Jun 6 2011, 18:27
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Keks
сообщение Jun 7 2011, 21:34
Сообщение #3430


Level 3
*

Класс: Теневой Танцор
Характер: Lawful Neutral
Раса: Человек



я как человек не искушенный в БД через SQLite подключал
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jun 8 2011, 08:57
Сообщение #3431


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Цитата
С бд в принципе и mysql в частности до вчерашнего дня дела не имел, наверняка где-то тут кроется причина
Самое простое - взять сборку типа денвера, там есть субд и веб-сервер со специальной мордой для взаимодействия с мусклом. Для разработки - самое то.
Цитата
я как человек не искушенный в БД через SQLite подключал
Если с бд будет взаимодействовать только сервер (т.е. никаких армори, онлайн-списков игроков, пополнения всякой фигни дмами в реальном времени и прочее), то это идеальный вариант. БД будет в файле, так что никакого гемора с настройкой субд и потерей коннекта. Благодаря реконнекту последнее не очень очевидно, но вылезает в виде забавных багов (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Keks
сообщение Jun 8 2011, 21:23
Сообщение #3432


Level 3
*

Класс: Теневой Танцор
Характер: Lawful Neutral
Раса: Человек



Берем любой плагин для БД (я юзаю SQLite Expert Personal version 2.3.49), устанавливаем его на комп, затем берем папочку НВН и дублируем ее (скажем обозвав NWN_Server) в тот же каталог, где стоит клиентская версия, таким образом получается 2 папки, полностью подобные, но с разными названиями. Я работаю только в папке NWN_Server (правлю модуль, создаю ерки и пр.), из нее же запускаю NWNX, а из клиентской папки запускаю только игровой процесс.
Таким образом ставить виртуальные сервера на комп НЕ НАДО. Таким образом уже года 3 все пашет оки.

Цитата
Благодаря реконнекту последнее не очень очевидно, но вылезает в виде забавных багов smile.gif
Если честно, как-то не замечал багов, хотя человек спрашивает для "рабочей машины", т.е. дома делать неискушенному человеку, повторюсь, тут это оптимальный вариант, а для сервера да, лучше MYSQL

З.ы. А отредактировать чара в момент создания артмани и ему подобными можно, т.к. чар создается локально и только после нажатия кнопочки "Играть" в первый раз дублируется на сервере в папке аккаунта. Т.е. изначально чар локален, а следовательно с ним мона делать все, что душе угодно. Выдача плюшек и "всякой фигни" ДМами обрабатывается движком сервера по запросу из ДМклиента, т.ч. таким образом можно редактировать чаров игроку.

Сообщение отредактировал Keks - Jun 8 2011, 21:29
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Talarasha
сообщение Aug 29 2011, 01:02
Сообщение #3433


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



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

Код для ознакомления:
Neverwinter Script
void EtherealVision(int Color1, int Color2, int Recovery = 0)
{
    object oPC = GetFirstPC();
    object oArea = GetArea(OBJECT_SELF);
    int Height = GetAreaSize(AREA_HEIGHT);
    int Width = GetAreaSize(AREA_WIDTH);
    vector v = Vector(0.0f, 0.0f, 0.0f);
    location Pointer;

    // Main cycle; 10.0f is because Tile functions has it's own coordinate
    // system (we got coordinate of points and tile functions uses coordinate
    // of grid (integer number of squares, first square [0][0] is a bottom left)
    while(v.y < Height * 10.0f)
    {
        v.x = 0.0f;
        while(v.x < Width * 10.0f)
        {
            v = Vector(v.x/10.0, v.y/10.0, 0.0f);
            Pointer = Location(oArea,v,0.0f);
            if(Recovery == 0) // Remember colors
            {
                SetLocalInt(oArea,"TILECOLOR1"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)),
                    GetTileSourceLight1Color(Pointer));
                SetLocalInt(oArea,"TILECOLOR2"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)),
                    GetTileSourceLight2Color(Pointer));
            }
            else // Recover colors if it's a recovery call
            {
                Color1 = GetLocalInt(oArea,"TILECOLOR1"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)));
                Color2 = GetLocalInt(oArea,"TILECOLOR2"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)));
            }
            SetTileSourceLightColor(Pointer,Color1,Color2);
            v = Vector(v.x*10.0, v.y*10.0, 0.0f);
            v.x = v.x + 10.0f;
        }
        v.y = v.y + 10.0f;
    }
    RecomputeStaticLighting(oArea);
}

По "функция(цвет1,цвет2)" включает режим, по "функция(0,0,1)" выключает.

Сообщение отредактировал Talarasha - Aug 29 2011, 01:05
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Aug 29 2011, 10:13
Сообщение #3434


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Динамическое освещение в НВН вообще глючное, и RecomputeStaticLighting работает криво. Видимо, это один из его багов, наряду со свечением у плейсов после его выполнения.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 9 2011, 15:04
Сообщение #3435


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



А как сделать,что бы НПС ходил туда-сюда от сундука к сундуку и совершал анимацию "открыть ключом"?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 9 2011, 17:14
Сообщение #3436


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Ставится на триггер (например, у двери, за которой находится NPC. Наиболее оптимальный метод, ибо NPC начнет ходить только тогда, когда его видят (в зависимости от того, для мультиплеера модуль или нет надо дописывать прерывание похождений, когда перестают видеть)) на событие OnEntered

Neverwinter Script
void main()
{
object
        oNPC = GetNearestObjectByTag("NPCTag", GetEnteringObject()),
//Ходить будет ближайший к игроку NPC c тэгом NPCTag
        oCont1 = GetNearestObjectByTag("Container1Tag", oNPC),
//Обозначаем первый сундук. Это окажется ближайший к NPC сундук с тэгом Container1Tag.
        oCont2 = GetNearestObjectByTag("Container2Tag", oNPC);
//Обозначаем второй сундук. Это окажется ближайший к NPC сундук с тэгом Container2Tag.

vector vPos;
//Для дальнейшего использования

int i = 0;
//Для дальнейшего использования

AssignCommand(oNPC, ClearAllActions(TRUE))
while(i<1)
//1 - количество проходов NPC по маршруту
//[позиция NPC] - первый сундук - второй сундук,
{
  ++i;
  //закомментировать строчку выше - плохая идея, ибо при попытке использования бесконечного цикла
  //nwn благополучно зависает
  AssignCommand(oNPC, ActionMoveToObject(oCont1, FALSE));
  //NPC идет к первому сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont1))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //После того, как NPC подошел к сундуку, идет проигрышь анимации ANIMATION_LOOPING_GET_LOW
  //(можно заменить на цифру 12, см. лексикон на "ANIMATION_* Constant Group") со стандартной
  //скоростью (1.0 - коэффициент скорость относительно начальной скорости анимации, т.е.
  //заменив 1.0 на большее число можно увеличить скорость проигрыша анимации, аналогично можно
  //ее уменьшить) в течение трех секунд (3.0) (коэффициент скорости влияет только на время
  //проигрыша FnF-анимаций, которыми не используется параметр времени проигрыша)
  AssignCommand(oNPC, ActionMoveToObject(oCont2, FALSE));
  //NPC идет ко второму сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont2))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //аналогично предыдущему
}
}

ВНИМАНИЕ:
Neverwinter Script
vPos = GetPosition(oNPC);
возвращает стартовую позицию NPC, а не нынешнюю. Следовательно, "поворачивание" NPC будет работать криво. Чтобы работало прямо, надо найти метод получения вектора местонахождения на момент запроса и заменить GetPosition(oNPC) на него. Есть подозрение, что такая проблема возникла из-за использования стека. Альтернативный метод выпила данной кривоты - удаление "поворотов" из скрипта и расставление сундуков друг напротив друга, желательно строго напротив.

Сообщение отредактировал wirTUS - Sep 9 2011, 17:18
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 9 2011, 21:34
Сообщение #3437


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(wirTUS @ Sep 9 2011, 19:14) *
Ставится на триггер (например, у двери, за которой находится NPC. Наиболее оптимальный метод, ибо NPC начнет ходить только тогда, когда его видят (в зависимости от того, для мультиплеера модуль или нет надо дописывать прерывание похождений, когда перестают видеть)) на событие OnEntered

Neverwinter Script
void main()
{
object
        oNPC = GetNearestObjectByTag("NPCTag", GetEnteringObject()),
//Ходить будет ближайший к игроку NPC c тэгом NPCTag
        oCont1 = GetNearestObjectByTag("Container1Tag", oNPC),
//Обозначаем первый сундук. Это окажется ближайший к NPC сундук с тэгом Container1Tag.
        oCont2 = GetNearestObjectByTag("Container2Tag", oNPC);
//Обозначаем второй сундук. Это окажется ближайший к NPC сундук с тэгом Container2Tag.

vector vPos;
//Для дальнейшего использования

int i = 0;
//Для дальнейшего использования

AssignCommand(oNPC, ClearAllActions(TRUE))
while(i<1)
//1 - количество проходов NPC по маршруту
//[позиция NPC] - первый сундук - второй сундук,
{
  ++i;
  //закомментировать строчку выше - плохая идея, ибо при попытке использования бесконечного цикла
  //nwn благополучно зависает
  AssignCommand(oNPC, ActionMoveToObject(oCont1, FALSE));
  //NPC идет к первому сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont1))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //После того, как NPC подошел к сундуку, идет проигрышь анимации ANIMATION_LOOPING_GET_LOW
  //(можно заменить на цифру 12, см. лексикон на "ANIMATION_* Constant Group") со стандартной
  //скоростью (1.0 - коэффициент скорость относительно начальной скорости анимации, т.е.
  //заменив 1.0 на большее число можно увеличить скорость проигрыша анимации, аналогично можно
  //ее уменьшить) в течение трех секунд (3.0) (коэффициент скорости влияет только на время
  //проигрыша FnF-анимаций, которыми не используется параметр времени проигрыша)
  AssignCommand(oNPC, ActionMoveToObject(oCont2, FALSE));
  //NPC идет ко второму сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont2))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //аналогично предыдущему
}
}

ВНИМАНИЕ:
Neverwinter Script
vPos = GetPosition(oNPC);
возвращает стартовую позицию NPC, а не нынешнюю. Следовательно, "поворачивание" NPC будет работать криво. Чтобы работало прямо, надо найти метод получения вектора местонахождения на момент запроса и заменить GetPosition(oNPC) на него. Есть подозрение, что такая проблема возникла из-за использования стека. Альтернативный метод выпила данной кривоты - удаление "поворотов" из скрипта и расставление сундуков друг напротив друга, желательно строго напротив.

О-о-огромное спасибо!Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!Я научусь,будь уверен!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
nepejke
сообщение Sep 10 2011, 08:07
Сообщение #3438


Level 3
*

Класс: Монах
Характер: Lawful Neutral
Раса: Человек



всем привет, поспорил с человеком, насчёт возможности сокращения кода в нвн1.
существует ли возможность, создать отдельный скрипт который будет просчитывать метамагию, кастерлвл, спеллпенетру
дабы не захлямлять этим строчки в скрипте каждого спелла. Так вот, реально ли это всё соединить в 1 инклюд скажем, чтобы не писать в каждом спелле???

цит: "У НОРМАЛЬНЫХ ЛЮДЕЙ, а разрабы нвн по ходу не очень нормальные функция
http://www.nwnlexicon.com/compiled/functio...tlastspell.html - несла бы с собой все нужное от спелла, после того как спелл все посчитает:
Для боевых спеллов это только
getlastspell(dam) - посчитанный урон
getlastspell(dam_type) - тип урона

http://www.nwnlexicon.com/compiled/functio...pellcaster.html - она бы несла с собой такие вещи:
getlastspellcaster(sLevel) - с левел в зависимости от уровня колдующего.
getlastspellcaster(s_meta) - с какой метой пришел спелл
ну и так далее для любых спеллов где что нужно.

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

Код: [Выделить]
//Make SR Check
if (!MyResistSpell(OBJECT_SELF, getlastspellcaster(sLevel)))
{
//Make metamagic checks
if (getlastspellcaster(s_meta) == METAMAGIC_MAXIMIZE)
{
nDam = getlastspell(dam) + getlastspellcaster(sLevel); //Damage is at max
}
if (getlastspellcaster(s_meta) == METAMAGIC_EMPOWER)
{
nDam = getlastspell(dam) + (getlastspell(dam)/2); //+50% to Damage
}
//здесь же экстенд спелл для длительности, впадлу дописывать. А вот сайлент хуяйлент должны так же отдельно обрабатываться в каком нибудь _onspellcast
//все, посчитали да, теперь эта же функция наносит урон, с утра впадлу искать чем он там наносит будем так
f.damage(nDam, getlastspell(dam_type))
//СЮДА ЖЕ ДОПИСЫВАЮТСЯ ПЕРЕД f.damage все абсорбящие заклинания. Надеюсь понятно да как это происходит?

И в итоге КАЖДЫЙ СПЕЛЛ В НВН получает минус 15 строк не теряя абсолютно своего функционала и возможность вносить в него изменения меняя только циферку, можно дописать в него любые эффекты, и прочее.
Это за вычетом того, что функция потом будет нести в себе абсорбы с защитных спеллов, что разгрузит ту функцию, которая считает абсорбы и прочее, я думаю, что она тоже дублирована раз 50.
Да и сама механика абсорбов сведется к одному таймеру с набором переменных для окончания длительности, а количество абсорбов будет висеть просто на чаре. Это открывает нормальное суммирование эффектов абсорбов и прочее.
Так же ЭТОТ ЕВЕНТ МОЖЕТ ОТВЕЧАТЬ И ЗА ЛЕЧАЩИЕ СПЕЛЛЫ ТЕМ САМЫМ РАЗГРУЗИВ И ИХ.
Вот и посчитай, насколько меньшим и удобным будет код. "


я думаю что это не возможно, что думаете вы?

Сообщение отредактировал nepejke - Sep 10 2011, 08:08
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Sep 10 2011, 15:08
Сообщение #3439


Level 11
Иконки Групп

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Нет такой возможности в НВН. Не говоря уж о том, что OnSpellcastAt слот используется совсем для других целей.
Твоя гипотетическая реализация - крайне негибка, стоит придумать нетривиальный спелл, и его реализация немедленно добавит десяток строчек в пухнущий свич общего скрипта по spellid. Биоварская реализация, если и не оптимальна, то близка к этому.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 10 2011, 17:37
Сообщение #3440


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(ReZkiy @ Sep 9 2011, 23:34) *
О-о-огромное спасибо!Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!Я научусь,будь уверен!

А больше нет никаких предложений,люди???ПОМОГИТЕ ЕЩЕ!!!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 136 137 138 139 140 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 9th May 2025 - 05:43