![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3416
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата перечитал описание CreateItemOnObject в Лексиконе, по тэгам можно вызывать только предметы стандартной палитры, почему собс-но золото и дается Это де-факто неправда. (IMG:style_emoticons/kolobok_light/smile.gif) Просто в стандартной палитре соблюдена конвенция - дефолтный тег предмета совпадает с его ресрефом, но написан в верхнем регистре. Строка, передаваемая в CreateObject/CreateItemOnObject(), автоматически конвертируется в нижний регистр, поэтому и так и получается. Никто не мешает соблюдать ту же конвенцию в кастомной палитре.
|
![]()
Сообщение
#3417
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Исправил, работает, спасибо
|
![]()
Сообщение
#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 ' было " ' " без пробелов
Сообщение отредактировал wirTUS - Jun 3 2011, 15:38 |
![]()
Сообщение
#3419
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
В нвскрипте нет массивов.
|
![]()
Сообщение
#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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#3422
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
А вот такой вопрос: что есть database и кастомный dialog.tlk, с чем их едят, в чем (и есть ли) преимущества кастомного "диалога" над стандартным?
Еще вопрос: можно ли для какого-нибудь feat'а, сделанного спеллом (как ярость варвара, например) сделать радиальное меню с выбором из n вариантов (как клик ПКМ на игрока)? Если да, то 1)Как? 2)Можно ли сделать многоуровневое радиальное меню (как ПКМ на игрока - spells - wizard - VI)? 3)Можно ли, "достраивать" это меню по ходу игры (например, прошел игрок по триггеру и бац! в меню фита новый пункт)? Сообщение отредактировал wirTUS - Jun 4 2011, 04:33 |
![]()
Сообщение
#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 |
![]()
Сообщение
#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) Нет. |
![]()
Сообщение
#3425
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Огромное спасибо
|
![]()
Сообщение
#3426
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
А вот вопрос по NWNx: куда и как он девает бд, созданую скриптом (был поюзан скрипт из примера по odbc)? Поиском обшарил на pwdata весь компьютер, ничего не нашел
|
![]()
Сообщение
#3427
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Странный вопрос. Честно говоря, я не помню, как MySQL хранит данные на харде, но зачем это вообще понадобилось? Есть удобный интерфейс для доступа к данным, зачем их физически на харде отлавливать?
Сам мускуль-то поставил? Без него (ну или SQLite/Postgres - но с мускулем проще всего) этот плагин в принципе работать не будет. Сообщение отредактировал Ilerien - Jun 6 2011, 14:23 |
![]()
Сообщение
#3428
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Там при распаковки NWNx в директорию игры по умолчанию стоит другой тип БД не MySQL, нужно в ручную за коментить в настройках NWNx ее и раскоментить MySQL. Может, в этом проблема?
|
![]()
Сообщение
#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 |
![]()
Сообщение
#3430
|
|
Level 3 ![]() Класс: Теневой Танцор Характер: Lawful Neutral Раса: Человек ![]() |
я как человек не искушенный в БД через SQLite подключал
|
![]()
Сообщение
#3431
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Цитата С бд в принципе и mysql в частности до вчерашнего дня дела не имел, наверняка где-то тут кроется причина Самое простое - взять сборку типа денвера, там есть субд и веб-сервер со специальной мордой для взаимодействия с мусклом. Для разработки - самое то.Цитата я как человек не искушенный в БД через SQLite подключал Если с бд будет взаимодействовать только сервер (т.е. никаких армори, онлайн-списков игроков, пополнения всякой фигни дмами в реальном времени и прочее), то это идеальный вариант. БД будет в файле, так что никакого гемора с настройкой субд и потерей коннекта. Благодаря реконнекту последнее не очень очевидно, но вылезает в виде забавных багов (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#3434
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
Динамическое освещение в НВН вообще глючное, и RecomputeStaticLighting работает криво. Видимо, это один из его багов, наряду со свечением у плейсов после его выполнения.
|
![]()
Сообщение
#3435
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
А как сделать,что бы НПС ходил туда-сюда от сундука к сундуку и совершал анимацию "открыть ключом"?
|
![]()
Сообщение
#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 |
![]() ![]()
Сообщение
#3437
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Ставится на триггер (например, у двери, за которой находится 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) на него. Есть подозрение, что такая проблема возникла из-за использования стека. Альтернативный метод выпила данной кривоты - удаление "поворотов" из скрипта и расставление сундуков друг напротив друга, желательно строго напротив.О-о-огромное спасибо!Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!Я научусь,будь уверен! |
![]()
Сообщение
#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 |
![]()
Сообщение
#3439
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Нет такой возможности в НВН. Не говоря уж о том, что OnSpellcastAt слот используется совсем для других целей.
Твоя гипотетическая реализация - крайне негибка, стоит придумать нетривиальный спелл, и его реализация немедленно добавит десяток строчек в пухнущий свич общего скрипта по spellid. Биоварская реализация, если и не оптимальна, то близка к этому. |
![]()
Сообщение
#3440
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
|
![]() ![]() |
Текстовая версия | Сейчас: 9th May 2025 - 05:43 |