![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3396
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
Neverwinter Script void main() или{ object oPC = GetEnteringObject(); object oArea1 = GetArea(oPC); vector Loc1 = GetPosition(oPC); object oArea2 = GetObjectByTag("FVgreatbridge"); vector vec = Vector(315.0, Loc1.y, 0.0); AssignCommand(oPC,ActionJumpToLocation(Location(oArea2, vec, 0.0))); } Neverwinter Script void main() { object oPC = GetEnteringObject(); object oArea1 = GetArea(oPC); vector Loc1 = GetPosition(oPC); object oArea2 = GetObjectByTag("FVgreatbridge"); AssignCommand(oPC,ActionJumpToLocation(Location(oArea2, Vector(315.0, Loc1.y, 0.0), 0.0f))); } А в твоём последнем вариант скобка не закрыта после AssignCommand. Сообщение отредактировал greye - May 23 2011, 19:26 |
![]()
Сообщение
#3397
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Огромное спасибо, особенно за терпение, работает
|
![]()
Сообщение
#3398
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Neverwinter Script int StartingConditional() { if(!HasItem(GetPCSpeaker(), "Mmodacid")||!HasItem(GetPCSpeaker(), "Mmodacid_long")||!HasItem(GetPCSpeaker(), "Mmodacid_strong")) return TRUE; return FALSE; } Задумка: проверка в диалоге наличия в инвентаре PC одной из трех вещей. (Немного модифицированный скрипт из мастера) Назначение: на реплику PC Симптомы: наличие реплики (возможность PC сказать ее) при полном отсутсвии данных предметов или при наличии всех трех Предостережение: в тэгах предметов несовпадений нет; правильно работает при одном либо двух предметах Предварительный диагноз: напортачено в логике |
![]()
Сообщение
#3399
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Судя по коду, если все теги написаны без ошибок, фраза должна появляться, если отсутствует хотя бы 1 предмет. Если хотя бы 1 тег написан неправильно, то фраза будет появляться всегда. Может, все-таки перепроверить теги? В частности, теги чувствительны к регистру.
Кстати, код намного легче читается, если операторы (вроде ||) выделять пробелами. Сообщение отредактировал Ilerien - May 24 2011, 21:14 |
![]()
Сообщение
#3400
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
А такой вопрос, возможно глупый: "!" случаем не обозначает отрицание?
Вопрос снимается, извиняюсь за беспокойство, именно так. Убрал - работает |
![]()
Сообщение
#3401
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Означает. Я ж говорю, в вышеприведенном коде проверка на отсутствие, а не на присутствие хотя бы одного предмета.
|
![]()
Сообщение
#3402
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Благодарю. Кстати, визард все условия (из тех, что я использовал) ставит "если не это условие, тогда вернуть FALSE", что равноценно "если это условие, тогда вернуть TRUE". Какая из этих конструкций эффективнее?
|
![]()
Сообщение
#3403
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Вторая.
Но гораздо изящнее без всяких проверок: Neverwinter Script int StartingContidional()
{ return <условие>; } Сообщение отредактировал Ilerien - May 25 2011, 10:10 |
![]()
Сообщение
#3404
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Еще раз спасибо.
Очередной вопрос: можно ли скриптом запретить игроку получать уровни в определенном классе до выполнения некоего условия? Задумка: реализовать условия получения престиж-классов по 3.5 (вроде убить кого-либо, кого убивать у игрока причин не было для ассасина/ достижения мирных отношений (или чего-то вроде, я обычно использовал контракт) с вызванным злым аутсайдером для блэкгарда) |
![]()
Сообщение
#3405
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Можно. В таблицах требований к классам (cls_pres_*) есть тип пререквизита VAR, который требует локальной переменной с указанным названием и значением на персонаже. По дефолту для каждого престижа указана в таблицах своя переменная с требуемым значением 0, что с точки зрения требований к классу включает в себя и отсутствие данной переменной на персонаже. Для запрета левелапиться ассассином, скажем, достаточно вызвать такой код:
Neverwinter Script SetLocalInt(oPC, "X1_AllowAsasin", 1); //oPC - игрок Я для своего проекта, который находится в стадии разработки, довольно широко использую этот принцип, поскольку он имеет огромную гибкость. Скажем, если ввести аналогичную переменную для паладина, можно реализовать его ограничение на мультикласс из 3.5. С другой стороны, за этой переменной нужно очень аккуратно следить.
Сообщение отредактировал Ilerien - May 25 2011, 14:25 |
![]()
Сообщение
#3406
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Большое спасибо
Опять проблема с условием Neverwinter Script int StartingConditional() { return ((GetAbilityScore(GetPCSpeaker(), ABILITY_INTELLIGENCE, TRUE) > 13) && (HasItem(GetPCSpeaker(), "Mmod_water")) && ((HasItem(GetPCSpeaker(), "Mmodacid")) || (HasItem(GetPCSpeaker(), "Mmodacid_long")) || (HasItem(GetPCSpeaker(), "Mmodacid_strong")))); } (все между фиг. скобками записано в одну строчку, напихал по методу "вдруг поможет" скобок, кол-во открывающих вроде как совпадает) Ругается "ERROR: UNKNOWN STATE IN COMPILER" планировалась конструкция "условие и условие1 и (условие2 или условие3 или условие4)". Так же: можно ли как-либо разрешить учить перформ кому угодно, а не только барду? Попробовал через хак с измененным CLS_SKILL_ROG.2da, в который добавлялся, собственно, перформ и ставился как класс скилл, но это не помогло. |
![]()
Сообщение
#3407
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Код правильный вроде, только скобок многовато.
Я бы навскидку сказал, что HasItem компилятор не признает из-за того, что не включена соответствующая библиотека через #include. Добавить перформ вору можно именно так, как ты описал. Не знаю, где косяк - может, в подключении хаков. Попробуй выставить еще в skills.2da AllClassesCanUse в 1. |
![]()
Сообщение
#3408
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
в 2da сейчас копаюсь, я там еще выставил неправильный skill index, а в скрипте действительно инклюд забыл, спасибо
|
![]()
Сообщение
#3409
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Очередной вопрос: можно ли поменять сообщение, выдаваемое игроку при исполнении скрипта
Neverwinter Script AdjustAlignment(oPC, ALIGNMENT_EVIL, -5); с "Your actions have shifted your alignment -5 point(s) toward Evil" на какое-либо другое и, если да, как это сделать? |
![]()
Сообщение
#3410
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Простым способом нельзя. Вероятно, можно через NWNX Chat как-то изловить, но я этот плагин не ковырял.
|
![]()
Сообщение
#3411
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Спасибо, попробую.
И еще вопрос: можно ли ставить скрипт, заполняющий инвентарь плэйсебла, на его onused, описывая плэйс как OBJECT_SELF, PC как GetLastUsedBy()? Проблема: скрипт компилится нормально, стоит на onUsed сундука с активированными флагами Plot, Useable и Has Inventory, при попытке открыть персонажем 1го уровня(как свежесгенеренным, так и экспортированным) сундук открывается, но его инвентарь пустой. Т.к. существует возможность пустого сундука при верном исполнении скрипта, пробовал перезаходить (3 раза подряд) и, т.к. ограничения в одно использование в скрипте нету, пробовал открывать несколько раз подряд. Собственно, скрипт. Neverwinter Script /////////////////////////////////////////////////////////////////// //Скрипт, спавнящий в плэйсеблы барахло///By HailAnDkilL aka/////// //почти по таблице 3-5(рандомные сокро-///wirTUS aka Бессонов////// //вища) DMG 3.5. Различия в вещах(пред-///Георгий Борисович//////// //ставлено не все, ибо некоторых вещей///////////////////////////// //в NWN нету, некоторые вещи бесполез-///////////////////////////// //ны, а до некоторых не дошли руки) и////////////////////////////// //в проверке не d100 и диапазоны вари-///////////////////////////// //антов, а рандом(кол-во вариантов)+1////////////////////////////// /////////////////////////////////////////////////////////////////// #include "NW_I0_GENERIC" string sARMTAG() { string sSTR="MUNDANEARMOR"; int iMARMV = Random(13)+1; int iMARMT = Random(9)+1; switch(iMARMV) { case 10: sSTR=sSTR+"10_"; case 11: sSTR=sSTR+"11_"; case 12: sSTR=sSTR+"12_"; case 13: sSTR=sSTR+"13_"; default: sSTR=sSTR+"0"+IntToString(iMARMV)+"_"; } sSTR=sSTR+IntToString(iMARMT); return(sSTR); } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// string sWEAPTAG() { string sSTR="MUNDANEWEAPON"; int iMWEMV = Random(12)+1; int iMWEMT = Random(4)+1; switch(iMWEMV) { case 10: sSTR=sSTR+"10_"; case 11: sSTR=sSTR+"11_"; case 12: sSTR=sSTR+"12_"; default: sSTR=sSTR+"0"+IntToString(iMWEMV)+"_"; } sSTR=sSTR+IntToString(iMWEMT); return(sSTR); } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// void PGTC(int var1, int var2) { object oGOLD = GetObjectByTag("NW_IT_GOLD001"); object oCHEST = OBJECT_SELF; SetItemStackSize(oGOLD, var1*var2); ActionGiveItem(oGOLD, oCHEST); } void main() { object oPC = GetLastUsedBy(); object oCHEST = OBJECT_SELF; int iPC_LVL = GetCharacterLevel(oPC); int iVAR1 = Random(5)+1; int iVAR2 = Random(3)+1; int iVAR3 = Random(3)+1; int iGEMV = d6(1); string sTAG; switch(iPC_LVL) { case 1: switch(iVAR1) { case 1: break; case 2: PGTC(d6(1),1); case 3: PGTC(d8(1),10); case 4: PGTC(d8(2),10); case 5: PGTC(d4(1),100); }/* switch(iVAR2) { case 1: break; case 2: sTAG="GEM"+IntToString(iGEMV); }*/ switch(iVAR3) { case 1: break; case 2: ActionGiveItem(GetObjectByTag(sARMTAG()), oCHEST); case 3: ActionGiveItem(GetObjectByTag(sWEAPTAG()), oCHEST); } } } инклюд требуется для работы GetCharacterLevel, без него все равно не работало (использовалась сумма трёх GetLevelByPosition) |
![]()
Сообщение
#3412
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Здесь нужно использовать не ActionGiveItem(), которая применяется для передачи уже существующих предметов, а CreateItemOnObject().
Neverwinter Script GetObjectByTag(sARMTAG()) //скорее всего, вернет OBJECT_INVALID Цитата инклюд требуется для работы GetCharacterLevel, без него все равно не работало (использовалась сумма трёх GetLevelByPosition) Можно использовать GetHitDice() - это сразу общий уровень.
Сообщение отредактировал Ilerien - May 30 2011, 21:26 |
![]()
Сообщение
#3413
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Исправил на
Neverwinter Script #include "NW_I0_GENERIC" string sARMTAG() { string sSTR="MUNDANEARMOR"; int iMARMV = Random(13)+1; int iMARMT = Random(9)+1; switch(iMARMV) { case 10: sSTR=sSTR+"10"; case 11: sSTR=sSTR+"11"; case 12: sSTR=sSTR+"12"; case 13: sSTR=sSTR+"13"; default: sSTR=sSTR+"0"+IntToString(iMARMV); } if(iMARMV<7) {sSTR=sSTR+"_"+IntToString(iMARMT);} return(sSTR); } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// string sWEAPTAG() { string sSTR="MUNDANEWEAPON"; int iMWEMV = Random(12)+1; int iMWEMT = Random(4)+1; switch(iMWEMV) { case 10: sSTR=sSTR+"10_"; case 11: sSTR=sSTR+"11_"; case 12: sSTR=sSTR+"12_"; default: sSTR=sSTR+"0"+IntToString(iMWEMV)+"_"; } sSTR=sSTR+IntToString(iMWEMT); return(sSTR); } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// void PGTC(int var1, int var2) { string oGOLD = "NW_IT_GOLD001"; object oCHEST = OBJECT_SELF; CreateItemOnObject(oGOLD, oCHEST, var1*var2, ""); } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// void main() { object oPC = GetLastUsedBy(); object oCHEST = OBJECT_SELF; int iPC_LVL = GetHitDice(oPC); int iVAR1 = Random(5)+1; int iVAR2 = Random(3)+1; int iVAR3 = Random(3)+1; int iGEMV = d6(1); string sTAG; switch(iPC_LVL) { case 1: switch(iVAR1) { case 1: break; case 2: PGTC(d6(1),1); case 3: PGTC(d8(1),10); case 4: PGTC(d8(2),10); case 5: PGTC(d4(1),100); } switch(iVAR3) { case 1: break; case 2: CreateItemOnObject(sARMTAG(), oCHEST, 1, ""); case 3: CreateItemOnObject(sWEAPTAG(), oCHEST, 1, ""); } } } Золото прилежно спавнит, вещи - нет. Тэги вещей заданы MUNDANEWEAPON[1-12]_[1-4], MUNDANEARMOR[1-6]_[1-9], MUNDANEARMOR[7-13] Примеры тэгов: "MUNDANEWEAPON10_4", "MUNDANEARMOR01_5", "MUNDANEARMOR09" Наиболее вероятно, что ошибка в процедурах, генерящих тэги |
![]()
Сообщение
#3414
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Теги тут вообще ни при чём. При создании объекта из палитры нужно указывать название ресурса (ResRef) - уникальный идентификатор ресурса в определённом пространстве имен (в данном случае, в пространстве наименований ресурсов предметов). Длина ресрефа (вообще для любого ресурса в NWN, хоть для скриптов или иконок) не превышает 16 символов - скажем, попытка создать предмет с ресрефом "MUNDANEWEAPON10_4" обречена на провал сразу же. (IMG:style_emoticons/kolobok_light/smile.gif)
Сообщение отредактировал Ilerien - May 31 2011, 02:34 |
![]()
Сообщение
#3415
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
Спасибо, сейчас буду исправлять, потом выложу что получится; перечитал описание CreateItemOnObject в Лексиконе, по тэгам можно вызывать только предметы стандартной палитры, почему собс-но золото и дается
|
![]()
Сообщение
#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 |
![]() ![]() |
Текстовая версия | Сейчас: 3rd August 2025 - 04:25 |