2GoDoom воткни в начало и будет меньше проблем.
Neverwinter Script Source |
// if (GetArea(OBJECT_SELF)!=GetArea(GetNearestPC())) {return;} /* Проверка для игры несколькими игроками. Разкомментируйте если вы собираетесь провести здесь партию. */ if (GetArea(OBJECT_SELF)!=GetArea(GetFirstPC())) {return;} /* Работает это для одиночного режима игры. Так проще и быстрее. */ |
Пиветсвую всех.
На досуге решил спросить:
1. Обьясните плз, если не трудно, на примере мне функцию float
2. Не знаю где спросить - как можно добавить свой спецэффект заклинания, такое вообще можно?
3. Не помню, потом спрошу
QUOTE |
Обьясните плз, если не трудно, на примере мне функцию float |
float это не функция, а тип чисел с плавающей точкой ( 0.5-это число типа флоат, 3-число типа int)есть функции преобразующие числа одного типа в другой ( FloatToInt например) в скриптах весьма важно какими числами и переменными пользуешся и что за число(какого типа) получается в результате вычислений.
QUOTE (Scaled @ Jun 8 2005, 05:31) |
2. Не знаю где спросить - как можно добавить свой спецэффект заклинания, такое вообще можно? |
Можно, если хорошо знаком с 3DMax'ом и MDL-плагином. Тема достаточно сложная.
Народ, подскажите начинающему мейкеру.
Проблема такая.
Перс появляется в таверне в начале модуля. Модуль снгл будет порядка 5-го уровня. Нужно чтобы не пришел броневик или слабак, - баланс нужен. Раздеть и вычистить инвентарь могу. Рядом сундук поставить для одевания в шмотки соотв. уровню - все это делается. Но вот, нужен скрипт: если он ниже 5-го добавить экспы - тоже вроде не сложно, а вот как если он будет 20-го до пятого сделать? Вариант как в Леворе "Вы уже где-то были" - не очень нравится.
Ответ Yuri: Есть функция, называющаяся,кажется SetXP. Она меняет асболютное количество экспы у PC и может снять уровни, если экспы станет меньше. Так что, делаешь SetXP(oPC, 10000) и он становиться 5 уровня.
Добавлено в [mergetime]1118293160[/mergetime]
Не подскажете, как можно ограничить выбор класса/скиллов/фитов при левелянии? Скажем разрешить брать уровень класса, только если игрок нашел тренера для этого класса?
Попробуй на слот OnPlayerLevelUP модуля воткнуть проверку. Какую тебе самому решать. Нет ее, долой уровень назад.
minion
Jun 10 2005, 12:49
mamuc Еще вопрос: я читал, что любой предмет может вместить до 75 строк скрипта. Теперь у меня появились сомнения. Вдруг мой скрипт вылезет за эти рамки, что тогда делать?
QUOTE |
и можно сделать так что бы обойтись и без поля int num; (неиспользовать) |
А как ты тогда придлагаешь мне различать комбинации с 3 и 4 ингридиентами?
minion
плохо читал. скрипт не имеет ограничений по объему. а речь шла об action queue - она вмещает максимум 75 акций.
minion
Jun 10 2005, 13:16
dumbo А-а-а-а! Спасибо что объяснил. И правда не внимательно прочитал!

Остался еще один вопрос!
Pather
Jun 10 2005, 13:17
minion
Насчет 75 строк ты, наверно, перепутал. Есть ограничение 75 действий в очереди команд. Скажем, если ты приказал персу скастовать подряд на себя 10 разных спеллов, то иконки этих действий выстроятся в левом верхнем углу и он их по очереди выполнит. То же самое, когда ты даешь объекту команду через скрипт. И вот их очередь не может превышать 75.
Никаких ограничений на размер скриптов для предмета нет.
minion
Jun 10 2005, 13:27
Pather
Спасибо это я уже понял. Вот кто бы мне второй вопрос по скрипту ответил. mamuc предложил, но его пока нет. Может кто еще знает?
ммм я вроде уже написал ,каким образом следовалобы это делать в общих чертах...
пожалуй напишу кокретный пример:
предположим что тот инклюд где ты определил структуру и написал SetupLab(nComboNumber) назыветься
craftspell_inc, тогда на OnClose сундука надо будет повесить примерно такой скрипт проверки наличия компонентов и , при успешной проверки, уничтожение компонентов и создание результата
Neverwinter Script Source |
#include "craftspell_inc"
int CheckComponent(object oBox,struct stRec stR) { int C1,C2,C3,C4; while (GetIsObjectValid(oItem)) { if (GetTag(oItem)==stR.req1) C1 = TRUE; if (stR.req2=="" || GetTag(oItem)==stR.req2) C2 = TRUE; if (stR.req3=="" || GetTag(oItem)==stR.req3) C3 = TRUE; if (stR.req4=="" || GetTag(oItem)==stR.req4) C4 = TRUE; oItem = GetNextItemInInventory(oBox); } if (C1&&C2&&C3&&C4) return TRUE; return FALSE; }
void main() { object oBox = OBJECT_SELF; object oItem = GetFirstItemInInventory(oBox); if (!GetIsObjectValid(oItem)) return; int nComboNumber; // zdesj zadajesh tebe nuzhnim sposobom znachenije nComboNumber // chtobi mozhno bilo bi vzjatj iz include craftspell_inc // strukturu skomponentami i rezuljtatom struct stRec stR; stR = SetupLab(nComboNumber); if(CheckComponent(oBox, stR)) { oItem = GetFirstItemInInventory(oBox); while (GetIsObjectValid(oItem)) { if (GetTag(oItem)==stR.req1) DestroyObject(oItem); if (GetTag(oItem)==stR.req2) DestroyObject(oItem); if (GetTag(oItem)==stR.req3) DestroyObject(oItem); if (GetTag(oItem)==stR.req4) DestroyObject(oItem); oItem = GetNextItemInInventory(oBox); } CreateItemOnObject(stR.rez,oBox); } } |
п.с. поскольку я человек ленивый, то за основу взял скрипт из соседней темы написаный Лехсом

как видишь количество компонентов в рецепте здесь не используеться
minion
Jun 10 2005, 14:38
mamuc Спасибо! все супер!

Но это все будет работать, если ингридиенты просто положить в сундук. А если мне надо что бы при кастовании определенного спелла?
Все равно спасибо за пример. Им я тоже воспользуюсь!
QUOTE |
А если мне надо что бы при кастовании определенного спелла?
|
ну тогда надо будет смодифицировать этот скрипт не ставить его наOnClose сундука,а пустить его через спеллхук например ..про спеллхук тут есть весьма подробно обьясненнопросто полистай темы и почитай
Scaled
Jun 11 2005, 04:41
javascript:ins("mamuc")
То есть проще говоря float - это дробное число.
А на примере какого-нибудь скрипта, а то я не очень сооброжу важность этого
Обьясните как замкнуть диалог, т. е. когда есть в диалоге некое главное меню и после рассказа одной истории происхдит возвращение в начало, ан е выход из диалога.
Да вот еще хотел спросить: вот есть скрипт такой проверка простейшая наличия 1000 монет у игрока, основаный на if и else
как привизать его к диалогу,чтобы при наличии попадать на одну ветьв диалога, а при отсутствии на другую?
Tiger Greyhawk
Jun 11 2005, 06:27
1.
QUOTE (Scaled @ Jun 11 2005, 05:41) |
То есть проще говоря float - это дробное число. А на примере какого-нибудь скрипта, а то я не очень сооброжу важность этого |
в разных функциях используются разные числа. Если функция использует float, то именно число с
плавующей точкой и надо писать: void ActionMoveToObject(object oMoveTo, int bRun=FALSE, float fRange=1.0f). Т.е. : ActionMoveToObject(oWP, FALSE, 2.5); крич подойдет на расстояние 2.5 метра до oWP.
А если int, то именно int и надо void JumpToObject(object oToJumpTo, int nWalkStraightLineToPoint=1)
Т.е. JumpToObject(oWP, 3); крич "прыгнет" к третьему oWP по счету от предмета с которого запустился скрипт... здесь же не может быть 3.5 по счету предмет...
2.
QUOTE (Scaled @ Jun 11 2005, 05:41) |
Обьясните как замкнуть диалог, т. е. когда есть в диалоге некое главное меню и после рассказа одной истории происхдит возвращение в начало, ан е выход из диалога. |
на фразе, на которую надо "послать" диалог нажимаешь правую кнопку мышки и выбираешь "копировать", а на той, с которой надо послать нажимаешь "связать".
З.Ы. Лекс или Лем, в вопросах и ответах я не нашел этого
3.
QUOTE (Scaled @ Jun 11 2005, 05:41) |
Да вот еще хотел спросить: вот есть скрипт такой проверка простейшая наличия 1000 монет у игрока, основаный на if и else как привизать его к диалогу,чтобы при наличии попадать на одну ветьв диалога, а при отсутствии на другую? |
QUOTE (Lex @ Feb 12 2005, 23:02) |
ВОПРОС Есть диалог, в котором должно быть две ветки. Первая, в случае истинности условия, вторая в случае его ложности. Объясните поподробнее, куда должен вставляться скрипт и как его писать. (условие - наличие оружие в руках героя).
ОТВЕТЫ Ставишь один лишь скрипт на TextAppearsWhen в первой ветке. Neverwinter Script Source int StartingConditional() { object oPC = GetPCSpeaker(); if (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) != OBJECT_INVALID){ // оружие в руке return FALSE; } return TRUE; }
|
Вот такая проблема. Не умею работать с DataBase, но необходимо сохранить стринг(сохранить его так, чтобы он пережил рестарт.)
Вот скрипт-инклюд:
Neverwinter Script Source |
//############################## //##############################
void SendMessageToAllPlayers( string sMessage );
void SendMessageToAll( string sMessage );
void CheckAccount( object oPC );
//##############################
void SendMessageToAllPlayers( string sMessage ) { object oPlayer = GetFirstPC(); while( GetIsObjectValid( oPlayer ) ) { SendMessageToPC( oPlayer, sMessage ); oPlayer = GetNextPC(); } }
void SendMessageToAll( string sMessage ) { SendMessageToAllDMs( sMessage ); SendMessageToAllPlayers( sMessage ); }
void CheckAccount( object oPC ) { object oStore = "IPaddress"; string sStoreName = GetPCIPAddress( oPC ); string sAccount = GetCampaignString( oStore, sStoreName );
if( ( sAccount != GetPCPlayerName( oPC ) ) && ( sAccount != "" ) ) { string sMessage = GetName( oPC ) + ". " + "Зафиксирована смена аккаунта. " + sAccount + " -> " + GetPCPlayerName( oPC ); SendMessageToAll( sMessage ); } SetCampaignString( oStore, sStoreName, GetPCPlayerName( oPC ) );
} |
Тестирую на Windows-сервере. До рестарта смену аккаунта засекает, после нет.
minion
Jun 11 2005, 18:19
mamuc К примеру поставитть его на ОнСпеллКастедЭт? И как я предложил с самого начала отслеживать кастуемый спелл и затем проверять к какому комбо он подходит. Пошел работать. Позже выложу что у меня получилось.
Мефистофель
Jun 11 2005, 21:22
Ребят от чистого сердца прошу, помогите мне.
Постараюсь объяснить на пальцах. У меня задумка, Игрок входит в дом, пройдётся по нему посмотрит всё и пойдёт обратно, а дверь закрылась как так? И попытается найти выход, и тут попадется ему странная полка он отодвинет её и найдёт потайной путь в подземелье.
А теперь по русски. Мне нужно чтобы ПК вошел в локу и Дверь закрылась, и открыть её можно было бы, только определённым ключом, если ПК кликнет на дверь то начнётся разговор, с самим собой, и. Только после этого можно будет использовать полку, и поговорить с ней. Я понимаю скрипт сложный. Но самому мне не справится.
minion
Jun 11 2005, 21:30
Для начала на событие локации ОнЭнтер повесь скрипт, который закроет дверь. На ОнЮзед двери повесь скрипт, который будет выполняться один раз. Т.е. запускать сам диалог. Следующая часть скрипта должна проверять на наличие ключа в рюкзаке. Если такого нет то сказать что дверь закрыта. Если есть то отпирать дверь и дестроить ключ. Вроде так.
Добавлено в [mergetime]1118514915[/mergetime]
На ОнЭнтер Вешаешь что-то типа:
Neverwinter Script Source |
void main () { object oDoor = GetObjectByTag ("sdes` pewew` tag dveri"); ActionCloseDoor (oDoor); SetLocked (oDoor, TRUE); } |
Добавлено в [mergetime]1118515322[/mergetime]
На ОнЮзед вешаешь что-то типа:
Neverwinter Script Source |
void main () { int iDoOnce = 0; if (iDoOnce != 1) { 092;092; сдесь начинаешь говорить с ПС iDoOnce = 1; 092;092; и создаешь свою полку } 092;092;сдесь проверяешь наличие ключа } |
Мефистофель
Jun 12 2005, 01:29
minion Насчёт первого скрипта я понел.
А вот насчёт второго, извени но обсалютно ничего, я просто скрипты плохо знаю.
minion
Jun 12 2005, 15:32
вот примерный скрипт:
Neverwinter Script Source |
void ActionCreateObject (string sCreature, location lLoc) { CreateObject(OBJECT_TYPE_PLACEABLE, sCreature, lLoc); }
int PlayerHasItem(object oPC, string s) { return GetIsObjectValid(GetItemPossessedBy(oPC, s)); }
void main() { object oPC = GetEnteringObject (); object oDoor = GetObjectByTag ("zdes piwew tag dveri") string sPolka = "zdes piwew resref polki, kotoruu sozdaem"; location locPolka = GetLocation (GetWaypointByTag ("zdes piwew tag triggera mesta gde budet polka")) if (GetLocalInt (oPC, "DoOnce") == 0) { ActionStartConversation (oPC, "zdes piwew resref dialoga"); ActionCreateObject (sPolka, locPolka); SetLocalInt (oPC, "DoOnce", 1); //teper dialog budet rabotat odin raz } //teper proveryaem nali4ie klu4a if (PlayerHasItem (oPC, "zdes piwew tag klu4a kotorim otkrivaetsya dver")) { SetLocked (oDoor, FALSE); ActionOpenDoor (oDoor); DestroyObject (GetObjectByTag ("zdes piwew tag klu4a")); } else { AssignCommand (oPC, SpeakString ("Sorry!! The door is locked!")); }
} |
-fenix-
Jun 12 2005, 16:17
У меня такой вопросик. Если нужно сделать кутсцену в самом начале модуля, типа это сон герою снится, то как быть с запуском скрипта. Тут говорили, что на онэнтер локи скрипты ставить не льзя, они глючить будут. А если в начале скрипта черный экран сделать секунды на 3, это прокатит?
minion
Jun 12 2005, 17:13
Не знаю у меня висит на ОнЭнтер и работает нормально.
Я дописал свой скрипт!!! Огромное спасибо за помощь Aiwanу и отдельное спасибо mamucу. Теперь все готово и работает. Вот скрипт.
Этот кусок обзываем как spell_items_0
Neverwinter Script Source |
struct stRec { string req1; string req2; string req3; string req4; string req5; string rez; };//sozdaem structuru dlya kombinacij
struct stRec SetupLab (int nSpellID) { struct stRec stR; switch (nSpellID) { case 115: //kislotnaya strela melfa stR.req1 = "NW_IT_MSMLMISC12"; // bolotnaya yagoda stR.req2 = "NW_IT_MSMLMISC09"; // glaz rakwasa stR.req3 = "NW_IT_MSMLMISC10"; // yazik slaada stR.req4 = "NW_IT_MSMLMISK08"; // bruho ognennogo guka stR.rez = "NW_IT_MRING004"; // to 4to hotim polu4it break; case 107: // volwebnaya raketa stR.req1 = "NW_IT_MSMLMISC12"; stR.req2 = "NW_IT_MSMLMISC10"; stR.req3 = "NW_IT_MSMLMISK14";//4erep gorgul`i stR.rez = "NW_IT_MBOOTS004"; break; } return stR; }
int CheckOneItem (string sItem, struct stRec strItem) { if ((sItem == "") || (sItem == strItem.req1) || (sItem == strItem.req2) || (sItem == strItem.req3) || (sItem == strItem.req4) || (sItem == strItem.req5)) { return TRUE; } else { return FALSE; } }
int CheckFirstItem (string sItem, struct stRec strItem) { if ((sItem == strItem.req1) || (sItem == strItem.req2) || (sItem == strItem.req3) || (sItem == strItem.req4) || (sItem == strItem.req5)) { return TRUE; } else { return FALSE; } }
int CheckComponent (struct stRec stR, object oBox) { int C1,C2,C3,C4,C5; object oItem = GetFirstItemInInventory (oBox); while (GetIsObjectValid (oItem)) { if (CheckFirstItem (GetTag(oItem), stR)) C1 = TRUE; if (CheckOneItem (GetTag(oItem), stR)) C2 = TRUE; if (CheckOneItem (GetTag(oItem), stR)) C3 = TRUE; if (CheckOneItem (GetTag(oItem), stR)) C4 = TRUE; if (CheckOneItem (GetTag(oItem), stR)) C5 = TRUE; oItem = GetNextItemInInventory (oBox); } if (C1&&C2&&C3&&C4&&C5) return TRUE; return FALSE; } // proveryaet sootvetstvuet li to 4to mi pologili v sunduk s kombinaciej
void BadResult () { object oPC = GetLastSpellCaster (); int nDamage = d20() * 2; effect eVis = EffectVisualEffect (VFX_IMP_FLAME_S); effect eDam = EffectDamage (nDamage, DAMAGE_TYPE_FIRE); DelayCommand (0.6, ApplyEffectToObject (DURATION_TYPE_INSTANT, eVis, oPC)); DelayCommand (0.6, ApplyEffectToObject (DURATION_TYPE_INSTANT, eDam, oPC)); } // esli ne sootvetstvuet nanosim povregdeniya
void CreateLabItem (int nCastedSpell) { struct stRec stR; stR = SetupLab (nCastedSpell); if(CheckComponent(stR, OBJECT_SELF)) { object oItem = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oItem)) { DestroyObject(oItem); // uni4togaem ob`ekti oItem = GetNextItemInInventory(OBJECT_SELF); } CreateItemOnObject(stR.rez); } else { BadResult (); } } // sozdaem vew, |
вот основной скрипт
Neverwinter Script Source |
#include "spell_items_0" void main() { CreateLabItem (GetLastSpell ()); } |
Мефистофель
Jun 12 2005, 19:52
Куча вопросов, блин. Вы уж простите. Но помогите.
1.Как использовать функцию AktionAttak.
2. У Тулсете есть специальные триггеры битвы. Называется «Раскрасить Встретившихся». Дак вот как мне задать точку, чтобы именно от туда появлялись монстры.
3. Дайте, пожалуйста, скриптик, чтобы если Уничтожено 4 объекта с определенными Тегами. То строка в диалоге появится, если нет то нет.
-fenix-
Jun 12 2005, 21:50
2Мефистофель
1.
void ActionAttack(object oAttackee, int bPassive=FALSE)
object - это объект, на который будет происходить атака.
int bPassive - атака в пассивном (если стоит TRUE) или в активном режиме (если стоит FALSE)
2.
Цитата из Aurora Toolset Айвана. Прочитай его.
QUOTE |
Если оставить наш encounter нарисованным на локации в виде большой области, то монстры появятся по всему периметру. Если вам необходимо, чтобы нападение произошло из заданной точки, то нужно нажать на очерченный encounter правой кнопкой мыши и выбрать пункт "Add spawn point" (Рис. 46). Появится стрелка, указывающая на черный треугольник, этот треугольник и будет точкой spawn'а монстров. Точек spawn'а может быть несколько, сделайте их и перетащите мышкой в нужное место. Рис. 46. Важно! При точках spawn'а монстры будут появляться лицом в ту сторону, в которую направлена самая маленькая сторона, являющаяся основанием равнобедренного треугольника. И монстры будут появляться только из той точки, которая находится перед наступившим на область encounter'а объектом (NPC, PC). Выглядит это так: вы делаете encounter и ставите три точки spawn'а в разные стороны. С какой бы стороны вы не подошли, противник всегда будет появляться в точке перед вами. И еще один слот – OnExhausted. Он срабатывает, если вы выбрали опцию "Single-Shot spawn" и в локации исчезли все противники.
|
Мефистофель
Jun 13 2005, 00:45
2-fenix-
Спасиб, а вот готовый скрипт про атаку взгянуть, можно а то я так ничё не понимаю.
-fenix-
Jun 13 2005, 13:31
2Мефистофель
3.
На OnDeath челов ставим это.
Neverwinter Script Source |
void main() { object oChel = GetObjectByTag ("Тег чела с кем базарить");
SetLocalInt(oChel, "Первый чел, Второй, Третий, четвертый", 1); } |
А на проверку фразы это
Neverwinter Script Source |
int StartingConditional() { if(GetLocalInt(OBJECT_SELF, "Первый чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Второй чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Третий чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Четвертый чел") == 1) { return TRUE; } return FALSE; } |
Добавлено в [mergetime]1118684998[/mergetime]
QUOTE |
Спасиб, а вот готовый скрипт про атаку взгянуть, можно а то я так ничё не понимаю. |
Вот переделка скрипта на разговор
Neverwinter Script Source |
void main() { if(GetLocalInt(OBJECT_SELF, "Первый чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Второй чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Третий чел") == 1 &&
GetLocalInt(OBJECT_SELF, "Четвертый чел") == 1) { ActionAttack(GetPCSpeaker(), False); } } |
Если все эти локальные переменные равны 1, то Чел будет атаковать заговорившего PC в активном режиме(а, что это значет ХЗ).
З.Ы Объясните, что значат эти режимы ПЛИЗЗЗ.
Scaled
Jun 14 2005, 05:13
Приветствую всех.
Как сделать в модуле, чтобы встреча спавнилась только ночью или только днем?
Neverwinter Script Source |
if (GetIsDay()) { // i tut to chto nado delatj dnem //dlja nochi pohozhe } |
Scaled
Jun 15 2005, 12:44
Маmuc
Это понятно, я не знаю как активизировать эту размещаемую встречу.
Добавлено в [mergetime]1118828800[/mergetime] Вот наступает ночь и встреча должна работать, а когда пиходит день - нет. Как это сделать?
Добавлено в [mergetime]1118828896[/mergetime] Я хочу понять как активизировать встречу.
Во спросил
DBColl
Jun 15 2005, 13:06
Scaled
Цитирую из Lexicon'а:
QUOTE |
SetEncounterActive(int, object)
Sets an encounter to active or inactive.
void SetEncounterActive(int bNewValue, object oEncounter = OBJECT_SELF);
Parameters
bNewValue TRUE if the encounter is active, otherwise FALSE.
oEncounter The encounter to set active or inactive. (Default: OBJECT_SELF)
Description
Set oEncounter's active state to nNewValue. When an encounter is exhausted it will set itself to be "not active". If your encounter is set for "Continuous" respawns, it will reset itself to "active" each time the Respawn Time lapses. If you want to use the SetEncounterActive function to control exactly when the encounter is active then you need to use the "Single Shot" setting on the encounter.
Remarks
From Victor Morales: I have tried the SetEncounterActive function to spawn creatures at different times of the day. For example, I only wanted the undead in a cemetery to spawn if it was nighttime. If the encounter active flag is set to FALSE to begin with (in the encounter GUI window when the encounter is created) then the SetEncounterActive function will spawn them properly the first time. It seems that the creatures are set to spawn before the OnEnter event is checked for validity. In addition, once the active flag is set it won't revert until the next time the encounter is triggered. So I would have undead that would spawn at night properly, but once they spawned - if the time changed to day they would spawn at least one more time during daylight hours. Then the trigger would work properly again. I tried to make it reset the active flag to active OnEnter, then the creatures would spawn, and to reset it to inactive OnExit. However, that didn't work either and the behavior stayed the same. You can draw a trigger around the encounter and call this function from OnEnter of that trigger instead as a workaround.
|
Scaled
общий смысл цитаты из лексикона сводится к тому, что если хочешь нормально управлять encounter'ом, то рисуй вокруг него триггер, и в OnEnter оного производи необходимые тебе действия. т.е. в твоем случае в OnEnter окружающего encounter триггера нужно вписать:
Neverwinter Script Source |
void main() { object oEnc = GetObjectByTag("тэг encounter'а"); SetEncounterActive(GetIsNight(), oEnc); } |
ps. чтобы не париться с вырисовыванием триггера, проще нарисовать такой же по форме, но чуть больше по размерам и расположить encounter внутри этого триггера.
pss. тэг подправил.. ведь "dd_night_enc" могут и не понять.
DBColl
Jun 15 2005, 14:01
dumbo Совсем не обязательно вырисовывать внешний управляющий триггер. Достаточно эти функции юзать на самом Encounter в его OnEnter.

Ночной.
Neverwinter Script Source |
void main() { SetEncounterActive(GetIsNight(), OBJECT_SELF); } |
Не ночной.
Neverwinter Script Source |
void main() { SetEncounterActive(!GetIsNight(), OBJECT_SELF); } |
Добавлено в [mergetime]1118833521[/mergetime] ЗЫ. Такая схема вполне успешно ведет себя в Леворе. Так что ремарка от Виктора Моралеса ошибочна.
DBCollверишь-нет: еще до чтения ремарки проверил именно путем внедрения в OnEnter SetEncounterActive(GetIsNight()) - не ра-бо-та-ет. посмотрел на поведение, и мысли закрались о том, что он выплевывает крич либо до запуска OnEnter, либо просто после прогона OnEnter не проверяет active флаг. после увиденного пошел читать подробнее и в обнаруженной ремарке нашел подтверждение своих мыслей...

видимо, у вас там что-то еще приделано...
DBColl
Jun 15 2005, 15:23
QUOTE (dumbo @ Jun 15 2005, 14:15) |
не ра-бо-та-ет. посмотрел на поведение, и мысли закрались о том, что он выплевывает крич либо до запуска OnEnter, либо просто после прогона OnEnter не проверяет active флаг. после увиденного пошел читать подробнее и в обнаруженной ремарке нашел подтверждение своих мыслей...видимо, у вас там что-то еще приделано... |
Нет, все именно так, как я сказал. Просто там надо мутить как-то с настройками САМОГО ЭНКАУНТЕРА. Я помню, долго бился с этим вопросом и в итоге нашел именно то положение настроек (active, continued и тп), при котором такая схема заработала.

Хотя не исключаю, что что-то в энкаунтерах могло быть пофиксено в ХотУ, потому что Левор, как известно, делался на СоУ и именно ТАМ все работало.
DBCollпрочитал описание еще раз

в настройках поставил Single Shot, Active сбросил - вот теперь все правильно работает с SetEncounterActive(GetIsNight()) в OnEnter encounter'a...
-fenix-
Jun 15 2005, 20:20
В функции
Neverwinter Script Source |
void ActionAttack(object oAttackee, int bPassive=FALSE) |
FALSE и TRUE - это атака в пассивном и активном режиме, а что эти режимы подразумевают, как их понимать.
-fenix-
пассивный режим означает то, что атакующий не будет бежать к атакуемому. если у него будет только оружие ближнего боя, то он будет курить бамбук. иначе постреляет.
-fenix-
Jun 16 2005, 13:09
Люди просветите, что в функциях делает это - int Reserved1(), int Reserved2...int Reserved85(), это ваще за чем?
-fenix-
непонятно, откуда ты это выкопал - в скриптах биоваров такого нет. обычно, такого рода имена встречаются в параметрах функций, полях структур, и делается это для того, чтобы впоследствии не менялся размер структуры, формат вызова функции - резервируется для возможного будущего использования. применимо к именам функций, да еще и в "своих скриптах", это выглядит как-то так... покажи кусок скрипта, где ты это нашел, и расскажи где ты его(этот скрипт) нашел.
ps. в результате прений и мега-флуда(ныне почившего) было выяснено: функции ReservedXX были введены в xp1(SoU) и заменены в xp2(HotU) на группу функций типа itemproperty и функции работы с ними.
-fenix-
Jun 17 2005, 11:24
Тут вот особо продвинутые люди создают собственные функции, не подскажет ли кто из них как это делать?
Или тут так не объяснить? Тогда хоть скажите с помощью каких прог(иль в самом тулсете), я тогда сам буду ковыряться(без тупых вопросов не обойтись

).
Friedrich
Jun 17 2005, 13:06
QUOTE=-fenix-, Jun 17 2005, 11:24]Тут вот особо продвинутые люди создают собственные функции, не подскажет ли кто из них как это делать?[/QUOTE]
Если это "тупой вопрос", то
функции объявляются следующим образом:
<тип возвращаемого значения> <имя функции>(<список параметров>)
{
<тело функции, т.е. тут описано, собственно то что эта функция делает.>
}
Пример:
Neverwinter Script Source |
//[NSS] // Вот функция kill. Она ничего не возвращает, поэтому // типом возвращаемого значения будет void // Функция имеет два аргумента: // object oVictim - это тот кого мы собираемся кильнуть // int nVis - константа визуального эффекта, которым будет // сопровождаться смерть несчастного. void kill(object oVictim, int nVis=VFX_IMP_DEATH) { effect eVis = EffectVisualEffect(nVis); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oVictim); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oVictim); }
// Вот функция hasItem, она проверяет наличие предмета с тегом sTagItem // В инвентаре объекта oInventory // Вернет TRUE если предмет есть, а иначе - FALSE int hasItem(object oInventory, string sItemTag) { return GetIsObjectValid(GetItemPossessedBy(oInventory, sItemTag)); }
// вот функция main - главная функция скрипта. // С нее начинается выполнения сценария и из нее вызываются // все остальные функции. Эта функция убет нарушителя, если // тот наступит куда не следует, не имея соответствующего // аусвайса! void main() { object oIntruder = GetEnteringObject(); if(!hasItem(oIntruder, "Ausweis")) { kill(oIntruder); } } |
Добавлено в [mergetime]1119003303[/mergetime]
QUOTE (-fenix- @ Jun 17 2005, 11:24) |
Скриптер проекта |
Если, вдруг имелось ввиду, как делать движковые функции, то сомневаюсь, что тут тебе кто-нить поможет (*слегка косится на Думбо*).
Хотя особо продвидуные наверное могут и не такое. Сделали ведь, говорять, какие-то умельцы SetName.
-fenix-
Jun 17 2005, 19:58
Friedrich
Я ни этот вопрос имел ввиду тупым. Я имел ввиду, что есле это трудно объяснить тут, то намекните и я сам буду разбераться, задавая попутно тупые вопросы.
А пользоваться этими функциями так ?
Neverwinter Script Source |
void kill(object oVictim, int nVis=VFX_IMP_DEATH) { effect eVis = EffectVisualEffect(nVis); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oVictim); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oVictim);
}
void main() { object oPC = GetPCSpeaker();
kill(oPC, VFX_IMP_DEATH);
} |
их надо объявлять в каждом скрипте.
QUOTE |
Если, вдруг имелось ввиду, как делать движковые функции, то сомневаюсь, что тут тебе кто-нить поможет |
Было бы интересно, но я до этого еще не дорос
это к чему???
И еще вопросы
1) Есть в НвН массивы или какие - нибудь условия со счетчиком(как в паскале for) или их делать с помощью while?
2) Есть в НвН метки(как в паскале label)?
3) просветите, что такое инклюд и как его юзать.
Почему столько вопросов? Потому что у меня наконец появилось время для того, что бы заняться изучением НвН'овского скриптинга по человечески. !!!НАКОНЕЦ!!!
Вот скачал сейчас два томика

скриптов, веселый вечер у меня намечается.
Friedrich
Jun 17 2005, 22:25
Феникс, лексикон посмотреть не судьба? Или с аглицким вообще никак? Даже если никак, то все равно посмотреть на досуге будет не вредно.
А ежели в чего-то Паскале шаришь, то я чего-то не понимаю твоих вопросов про функуии. Все точно также. Если есть есть какой-то кусок кода, который требуется регулярно выполнять, или он просто содержит какие-либо логически связанные действия или вычисления, то их целесообразно отделить от основной программы в отдельный блок - функцию или процедуру (void-функции - это считай как процедуры). Пользываться самописными функциями затем можно как стандартными.
Чтобы не переписывать одни и те же функции в разных скриптах, их можно объединять в библиотеки - инклюды (Биоварские инклюды обычно называится nw_i0_* или x*_inc_*, нп: nw_i0_generic).
Директивой #include "filename" при компиляции соотыетствующий файл будет добавлен к основному скрипту. Инклюд не должен содержать функии main.
Далее,
1) циклы в НВСкрипте конечно есть:
int i;
for (i = 0; i < 5; i++)
{
// statements ...
// this loop will cycle i as 0, 1, 2, 3, and 4
}
Аналог for i:=0 to 4 do
или н.п.:
for(i = 4; i >= 0; i--){}
аналог: for i:= 4 downto 0 do
while (expression) { statement; }
выполняется, пока expression истинно. Как в паскале, в общем.
do {statement;} while(expression); Как repeat ... until, только выполняется пока условие истинно.
2) Меток и goto естественно нету, т.к. они есть атрибут "дурного стиля программирования" (или фортрана).
3) Массивов как таковых нету, но если очень нужно - то их можно симулировать с помощью локалок по принципу:
Имя локалки = имя массива + номер ячейки. См. биоварский инклюд nw_o0_itemmaker
Еще советую почитать, хотя-бы книжечку по Си, которую тут Айван где-то выкладывал (на предмет синтаксиса). Хотя это не обязательно, Лексикону тебе за глаза хватит.
-fenix-
Jun 18 2005, 13:17
QUOTE |
Феникс, лексикон посмотреть не судьба? Или с аглицким вообще никак? Даже если никак, то все равно посмотреть на досуге будет не вредно. |
Да. С англицким вообще никак, но лексикон скачал и ковыряю его потихоньку с помощью сократа и лингво.
У меня просто раньше времени не было разбераться в НвН скриптах, экзамены и все такое. Все, что увидел мельком, это if и локалки, их пока и юзал. Про циклы с пост и предусловием в статьях нашел, а про for и label нигде не написано, вот и спросил есть ли таковые. Спсибо за ответы
И новый вопросик
Перевод Валео ни кто не заканчивал?
QUOTE (-fenix- @ Jun 18 2005, 16:17) |
Перевод Валео ни кто не заканчивал? |
Нет. Есть желание? Вперед!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.