QUOTE (Lex @ Jun 18 2005, 20:50) |
СОУ методы скриптига. Сам иногда грешу, но надо бы переходить на локалки. |
Тем кто может разобраться со скриптингом, мой код не очень то и нужен. А молодежи трудно будет объяснить куда вешать локалку, да еще если у нег например только СОУ... ТАк что этот код хоть и старомоден, но универсален для любого варианта.
Dik Morris
Jun 19 2005, 10:16
У меня опять вопрос...
Вот скрипт для открытия (и закрытия) двери, рычагом:
void main()
{
object oDoor=GetNearestObjectByTag("ТЭГ_ДВЕРИ");
if(GetIsOpen(oDoor)) // если она открыта
{
AssignCommand(OBJECT_SELF,ActionCloseDoor(oDoor));
// захлопнуть дверь. действие привязанно к рычагу.
SetLocked(oDoor,TRUE); // запереть дверь
ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
// рычаг переходит в другое положение
}
else if(!GetIsOpen(oDoor)) //иначе, если дверь не открыта
{
SetLocked(oDoor,FALSE);// отпереть дверь
AssignCommand(OBJECT_SELF,ActionOpenDoor(oDoor));
// открыть дверь.
ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
// перевод рычага в другое положение
}
}
Как все поняли этот скрипт на OnUsed рычага, я его туда ставлю, соответственно ввожу ТЭГ двери, но почемуто когда использую рычаг нечего не происходит.
-fenix-
Jun 19 2005, 10:32
Проверил скрипт, у меня все работает. Может ты тег не тот пишешь?
Friedrich
Jun 19 2005, 11:24
QUOTE (Equilibrium @ Jun 19 2005, 00:44) |
Предположим у нас есть мантия искателя приключений: +1 впитывание 30 поврежений
30 - это то насколько кменьшатся повреждения? Тогда что такое +1? |
Тута как я понимаю такое дело. Это значит, что "впитывание" пробивается только +1 и выше оружием. Т.е. Если тебя бьют обычным мечом, то все как сказал ДБ. Если +1, то твое "впитывание" уже не работает. Обычно такое свойство висит на шкурках всяких мэджик бистов, которые пробиваются только зачарованным оружием.
Если я ничего не перепутал.
Агрессинг
Jun 19 2005, 22:53
Dark@ngel
QUOTE |
Как заставить НПС сидеть на стуле? |
Neverwinter Script Source |
void main()
{ int nUser = GetUserDefinedEventNumber(); if(nUser == 1001) { if(GetLocalInt(OBJECT_SELF,"BUSY")==0) //если НПС не занят ни чем
{ SetLocalInt(OBJECT_SELF,"BUSY",1); // Ставим локалку, что НПС занят
if (!GetIsInCombat() && !IsInConversation(OBJECT_SELF)) // проверка на битву и диалог if (GetCurrentAction() != ACTION_SIT) { ClearAllActions(); int i = 1;
object oChair = GetNearestObjectByTag("[COLOR=red]ТЕГ СТУЛА(ИЛИ МОЖЕТ ТЫ ЕГО НА ГОРШОК ХОЧЕШЬ ПОСАДИТЬ)[/COLOR]", OBJECT_SELF,i); int bFoundChair = FALSE; while (bFoundChair == FALSE && GetIsObjectValid(oChair) == TRUE) //когда НПС нашел стул.... {
if (GetIsObjectValid(GetSittingCreature(oChair)) == FALSE) //если кто уже на нем сидит, то НПС не садится { bFoundChair = TRUE; //если он нашел стул.. ActionSit(oChair); // .. то плюхается на него } else { i++; oChair = GetNearestObjectByTag("Chair", OBJECT_SELF,i); } } if (bFoundChair == FALSE) // Если он НЕ нашел стул... {
ClearAllActions(); ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD); // то чешет репу и само собой никуда не садится } } } } } |
А вообще, возьми и покопайся в стандартных скриптах - найдешь много интересного.
Equilibrium
Jun 20 2005, 00:08
Friedrich, DBColl, Санькс.
Тогда еще вопросик:
Есть задачка, для решения которой у меня, пока что, слишком мало знаний:
Есть стафф, с тегом staf и РезРеф’ом staf.
Задача:
Если стафф лежит в контейнере.
И на контейнер кастуется заклинание.
То:
если это заклинание 0-го уровня
то у стаффом можно колдовать это заклинание бесконечно в день.
если 1-го
то – 5\день
если 2-го
4\день
3-го
3\день
4-го
2
5-го
1
Если у стаффа уже есть восемь заклинаний, и этим способом в него пытаются запихнуть девятое – стафф уничтожается с такой-то анимацией на контейнере.
В принципе, там еще проверки на наличие определенных предметов в том же контейнере, но это я и сам напишу.

Второй вопрос:
Можно ли сделать проверку на Школу магии, выбранную волшебником(цой)? Не пакет, а именно школу (Некромантия, Воскрешение, Иллюзия, Защитная...)
Archangel
Jun 20 2005, 12:00
QUOTE |
Как заставить НПС сидеть на стуле? |
Вставь это в OnHeartBeat НеПиСя:
Neverwinter Script Source |
void main { object oChair=GetObjectByTag("ТЭГ_СТУЛА") ActionSit(oChair); } |
А Агрессинг тебе загнул супер пупер скрипт с просто дофигищем проверок.
В большинстве случаев просто ненужных. Ну что уж поделать - у BioWare все оч продумано
ЗЫ
Агрессинг! Не пугай новичков!
QUOTE (Archangel @ Jun 20 2005, 15:00) |
Встась это в OnHeartBeat НеПиСя: |
Актион НПС не выдержит больше 75 действий. Соотвественно, если каждые 6 секунд будет даваться акция сесть, то скоро начнется дикий дебаг
Archangel
Jun 20 2005, 13:31
QUOTE |
Актион НПС не выдержит больше 75 действий. Соотвественно, если каждые 6 секунд будет даваться акция сесть, то скоро начнется дикий дебаг |
Да у меня НеПиСей так 30 с таким скриптом в OnHeartBeat стоят и ниче, живы еще
Ну есть еще один вариант.... моно вставить в OnSpawn, но тогда правильность действий не гарантирую...
-fenix-
Jun 20 2005, 16:27
QUOTE |
Да у меня НеПиСей так 30 с таким скриптом в OnHeartBeat стоят и ниче, живы еще biggrin.gif Ну есть еще один вариант.... моно вставить в OnSpawn, но тогда правильность действий не гарантирую...
|
В страшном скрипте Биоваров есть на такой случай проверка на занятость.
QUOTE (Archangel @ Jun 20 2005, 16:31) |
Да у меня НеПиСей так 30 с таким скриптом в OnHeartBeat стоят и ниче, живы еще |
Это настолько тупо и безгамотно, что я бы даже постеснялся говорить о таком на форуме.

У меян испоьзуется хербит пару раз для Евентов, но не больше.
Friedrich
Jun 20 2005, 18:19
Equilibrium
В общем, тебе нужно
1. получить кастуемый спел (константу)
2. получить левел спела. Функции типа GetSellLevel вроде нету (тем более, что одни и те же спелы могут быть разного уровня у разных классов. Да они еще метамагическими). Так что, придется ручками перебирать все константы и с помощью if ... else расставлять уровни. (Или упростить задачу).
3. Проверить на вещи кол-во свойств ITEM_PROPERTY_CAST_SPELL
4. Уничтожить вещь или добавить свойство (c этим тоже придется по париться).
Dark@ngel
Jun 20 2005, 19:21
У меня тут проблемка возникла, сама я не дойду:
Допустим есть локация-корабль с триггером выхода. Хочу сделать так, чтобы выйти с этой локации нельзя было в течение одного дня, а если будешь ломиться - то на триггере всплывал текст типа еще рано. Но потом по стечению 24 часов можно было выйти. Если это очень сложно, можно не отвечать я пойму.
QUOTE (Dark@ngel @ Jun 20 2005, 20:21) |
Допустим есть локация-корабль с триггером выхода. Хочу сделать так, чтобы выйти с этой локации нельзя было в течение одного дня, а если будешь ломиться - то на триггере всплывал текст типа еще рано. Но потом по стечению 24 часов можно было выйти. Если это очень сложно, можно не отвечать я пойму. |
просто, но я не уловил условие блокировки выхода в начале.. Те в какой момент лока закрывается..
Добавлено в [mergetime]1119287097[/mergetime]
Neverwinter Script Source |
void main() { object oClicker = GetClickingObject(); object oTarget = GetTransitionTarget(OBJECT_SELF);
SetAreaTransitionBMP(AREA_TRANSITION_RANDOM);
if (GetLocalInt(GetArea(OBJECT_SELF),"BLOCK")) { FloatingTextStringOnCreature("Çàáëîêèðîâàíî",oClicker,TRUE); return; } else { AssignCommand(oClicker,JumpToObject(oTarget)); } } |
На клике на переход местности.
Friedrich
Jun 20 2005, 20:10
В общем, должно быть на onClick триггера должны быть что-то в этом роде:
Neverwinter Script Source |
void main() { object oPC = GetClickingObject(); int nDate = GetLocalInt(OBJECT_SELF, "SHIP_NO_EXIT_DATE"); if(GetCalendarDay() == nDate) { object oDest = GetTransitionTarget(OBJECT_SELF); AssignCommand(oPC, ActionJumpToObject(oDest)); } else { AssignCommand(oPC, SpeakString("Сегодня выйти не выйдет!")); } } |
Локалку с датой, в которую нельзя сходить с корабля нужно повесить заранее (кстати, может быть лучше не на триггер, а на ПС или модуль). Н.п. при заходе чувака на корабль, загрузке модуля и т.п. (в зависимости от конкретных обстоятельств).
Dark@ngel это просто как 2х2=5. Чертишь триггер, соединяешь его с нужным, на он Ентр триггера ставь.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnExit //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /*
*/ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 20.06.2005 //::///////////////////////////////////////////// void main() { object oPC = GetEnteringObject(); // Взять того кто наступил object oJump = GetTransitionTarget(OBJECT_SELF); // Это объект куда надо попасть float fDel = 2880.0; /* Предположим, дин час игры равен 2 минутам. Это 120 секунд Задержка 1 день (fDel = 120*24*1) Если надо два дня то так: (fDel = 120*24*2) Если в модуле час равен 3 минутам то так: (fDel = 180*24*1) */ if (GetIsPC(oPC)) // Если тот кто наступил является Игроком { if (GetLocalInt(oPC, "TRANSITION")==2)// Если на нем локалка с числом 2, то попадет { // Куда ему надо AssignCommand(oPC, ClearAllActions()); AssignCommand(oPC, ActionJumpToObject(oJump)); return; } if (GetLocalInt(oPC, "TRANSITION")==1) // Если локалка ровна 1, то говорит фразу { SpeakString("Фраза"); return; } if (!GetLocalInt(oPC, "TRANSITION")) // Если Игрок наступил ПЕРВЫЙ раз. { SpeakString("Фраза"); // говорим фразу SetLocalInt(oPC, "TRANSITION", 1); // Отметим что наступил раз DelayCommand(fDel, SetLocalInt(oPC, "TRANSITION", 2)); // Задержим присвоение переменной на сутки. Как расчитан fDel см. выше. } } } |
Добавлено в [mergetime]1119292497[/mergetime] 
ЛОЛ...
LOL.
3 чела кинулись помогать девушке...
гы.. Понеслась.
Фрид
- привязка к дате это не есть гут
ну а в остальном как у меня.

Айв
- привязка к секундам не канает, если например отдохнуть 3 раза по 8 часов, то пройдет 100 секунд например и 24 часа игровых.. но выйти никак
- плохо, что отсчет времени идет от первого наступания
короче мой вариант само то. Вот только к нему продолжение:
там, где надо (может в диалоге, может еще где)
Neverwinter Script Source |
int nTime = GetTimeHour() + (GetCalendarDay() + GetCalendarMonth()*30)*24; SetLocalInt(GetObjectByTag("TAG_OF_AREA"),"BLOCK",TRUE)); SetLocalInt(GetObjectByTag("TAG_OF_AREA"),"BLOCK_TIME",nTime)); |
в ХБ локации
Neverwinter Script Source |
void main() { if (!GetLocalInt(OBJECT_SELF,"BLOCK")) return; int nTime = GetTimeHour() + (GetCalendarDay() + GetCalendarMonth()*30)*24; int nBTime = GetLocalInt(OBJECT_SELF,"BLOCK_TIME"); if ((nTime - 24 > nBTime )&&( nBTime != 0)) { SetLocalInt(OBJECT_SELF,"BLOCK",FALSE); SetLocalInt(OBJECT_SELF,"BLOCK_TIME",0); } } |
не проверял, но примерно так..
Friedrich, сенькс за скобки.
Friedrich
Jun 20 2005, 23:33
Айв, на онЕнтер инициализировать локалки не есть вери гуд. Я тоже сначала об этом подумал. Вряд ли нам нужно чтобы игрок не мог выйти в течении суток именно с момента первой попытки выйти.
Так что, время блокирования нужно задавать отдельно. И делать что Лекс сказал.
Тока:
if ( (nTime > (nBTime + 24)) && (nBTime != 0) ){
Гы-гы.

Скобки забыл! ХЗ вообще, у кого приоритет больше у "+" или ">".
Equilibrium
Jun 21 2005, 00:29
Friedrich
Спасибочки.
1)Понятно... почти... как у нас константа возвращается?
2)Эз... понятно... думал будет легче.
3)Санькс.
4)А по подробнее можно? Именно про добовление свойств?
Friedrich
Jun 21 2005, 01:03
Equilibrium
1) int GetLastSpell();
This is for use in a OnSpellCastAt script, it gets the ID (SPELL_*) of the spell that was cast.
4) Создаешь свойство:
itemproperty ItemPropertyCastSpell(int nSpell, int nNumUses);
Ахтунг! nSpell - это не константа спела (SPELL_*), это константа свойства предмета IP_CONST_CASTSPELL_*
Чтобы преобразовать одну в другую есть функция
IPGetIPConstCastSpellFromSpellID(int) из x2_inc_itemprop. Пользуй ее или пиши свою.
Добавляешь:
void AddItemProperty(
int nDurationType,
itemproperty ipProperty,
object oItem,
float fDuration = 0.0f
);
Внимательно почитай описания этих функций.
Equilibrium
Jun 21 2005, 02:55
Ой мамочки! Ох... Эээ... Дамссс...
В-вобщем с-спасибо т-тебе б-б-большое...
Чувст-твую н-на б-ближайшую нед-делю у м-меня уже есть з-задачка...
Lex,
Friedrich согласен с вами. НО вы не понимаете. Ваш код верный, но слишком сложен для новичка. Мой код воткнул и забыл. Когда она сможет сама разобраться в скриптинге наши советы отпадут.
Dik Morris
Jun 21 2005, 19:48
Если кому не трудно выложите скрипт, чтобы хейчман присоединялся к игроку.(или укажите название стандартного)
П.с: не думайте что ленюсь, искал этот скрипт в разговоре с хейчманом, но там их море.
Friedrich
Jun 21 2005, 21:31
void AddHenchman(
object oMaster,
object oHenchman = OBJECT_SELF
);
Агрессинг
Jun 21 2005, 22:47
Dik Morris
Советую таки получше изучить и всмотрется в стандартны оруженосческий диалог, если не хочешь, чтобы даже после присоединения он говорил что нибудь вроде: "Здраствуйте незнакомец, не хотите ли вы нанять оружееносца?" Легче всего посмотреть на фразе "Хотите взять Томи/Делана/Лину/Г-г-римгноу" к себе в команду."
ЗЫ
Кстати, скачай демо модуль из файлов и посмотри там скрипты - откроешь для себя много интересного, да и в своем модуле использовать ни кто не запрещает
Sorry за оффтоп, но надо же человеку посоветовать, как лучше, а то обойдется только одним скриптом.
Nick Parker
Jun 22 2005, 12:05
Меня интересует одна деталька. Как можно изменить внешность у НеПиСей? Почему я не могу сделать это в свойствах НПСа?
defolt
Jun 22 2005, 12:08
QUOTE (Nick Parker @ Jun 22 2005, 12:05) |
Меня интересует одна деталька. Как можно изменить внешность у НеПиСей? Почему я не могу сделать это в свойствах НПСа? |
как это? там же закладка appearence есть...
Nick Parker
Jun 22 2005, 12:11
defolt вот в этой-то закладке все серое, т.е. изменить ничего нельзя. Типа стандартная внешность и изменять незя.
Добавлено в [mergetime]1119431558[/mergetime]
Может потому что русская версия стоит?
defolt
Jun 22 2005, 12:16
QUOTE (Nick Parker @ Jun 22 2005, 12:11) |
defolt вот в этой-то закладке все серое, т.е. изменить ничего нельзя. Типа стандартная внешность и изменять незя. |
хых..ты кого менять то собрался? бомжа какого нить из оригинальной компании? скорее всего это у него просто криповская шкура на нем висит- цельная модель, посмотри, что написано на в закладке basic, в поле Appearence type..., что бы можно было менять, там по-моему должно быть написано что-то вроде "Elf, male"....
Nick Parker
Jun 22 2005, 12:45
QUOTE (defolt @ Jun 22 2005, 12:16) |
написано что-то вроде "Elf, male".... |
У меня написано "child, male" без толку. Попробовал и "elf, male" такая же фигня. Уже попробовал Английскую версию поставить. Все равно.
defolt
Jun 22 2005, 12:48
QUOTE (Nick Parker @ Jun 22 2005, 12:45) |
У меня написано "child, male" |
во!!!! сто процентов цельный скин- этого менять нельза...посмотри тогда типы Elf, Human и т.д...
Friedrich
Jun 22 2005, 12:52
Выбирай просто, Human, Elf, Dwarf etc.
child, male - это ж видно, цельная модель, как Арибет, например. Арибет ты тоже внешность не поменяешь.
Nick Parker
Jun 22 2005, 12:55
Сэнкс чуваки

. Я бы наверно еще неделю бы это догонял.
Dik Morris
Jun 23 2005, 10:19
"Всем известно что дриада, не может жить без своего дерева, уничтожишь дерево умрет, дриада"
Мне нужен скрип, чтоб когда игрок атаковал определенный предмет, у НПЦ, отнимались жизни, в случае уничтожения предмета умирал и НПЦ.Если кому не трудно выложте плиз.
-fenix-
Jun 23 2005, 13:00
на ОнДеаф дерева поставить это
Neverwinter Script Source |
void main() { object oNPC = GetObjectByTag("тег дерева"); effect oEf = EffectDeath(TRUE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, oEf,oNPC); AssignCommand(oNPC, SpeakString("я умераю")); } |
тогда дриада умрет вместе с деревом, а вот чтобы хиты при атаки отнимались?
Какой функцией можно изменять хиты у чела?
Блин чета меня колбасит, какой раз уже поправляю
Dik Morris
Jun 23 2005, 13:31
Спасибо брат!
Агрессинг
Jun 23 2005, 13:55
Dik Morris
Вот скрипт - отнимаются хиты при атаке, как заказывали.
Ставь галочку на дереве напротив ИСПОЛЬЗУЕМЫЙ а на OnDamaged дерева такой скрипт
Neverwinter Script Source |
void main() { object oNPC = GetNearestObjectByTag("ТЕГ ДРИАДЫ");
int nDamageNPC = GetCurrentHitPoints(oNPC) - GetCurrentHitPoints(OBJECT_SELF); // назначаем переменную ПоврежденияНПС, ты можешь назвать ее как хочешь : nDamageDRIADA например
if (nDamageNPC > 0) // если повреждения больше нуля, а то зачем ноль нужен? { ApplyEffectToObject(DURATION_TYPE_INSTANT,[color=red]EffectDamage(nDamageNPC),[/color]oNPC); // назначаем (выделенно красным, назначаем его как переменную, которую мы обозначили раньше) и применяем эффект повреждений, // если хочешь, чтобы после атаки на дерево НПС становился враждебным, добавь в конец скрипта это: SetIsTemporaryEnemy(GetLastAttacker(),oNPC); |
}
}
Тут собрался делать модуль
1) как после диалога включить у НПС анимацию смерти?
2) В проклятье Левора, когда в начале дядька умирает, появляется призрак, а потом прыгает вверх и исчезает. Как показать это в скриптах?
3)Тут было такое:
ВОПРОС
Как сделать чтобы при заходе игрока на триггер NPC начинал диалог?
ОТВЕТЫ
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); // Тот идиот что встал на триггер if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGERED") == 1) return; // Если это был не игрок, а кто то еще (матрица рулит), или он уже // наступал в это дерьмо один раз, то скрипт не сработает object oNPC = GetNearestObjectByTag("ТАГ_НПС"); // Тот придурок что должен сказать ПРИВЕТ! AssignCommand(oPC, ClearAllActions()); AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, SpeakString("Эй, придурок! Я к тебе обращаюсь!")); // Использую не ActionSpeakString, что бы НПС говорил фразу делаЯ что велено дальше AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oNPC)))); // Повернем мордой лица РС к НПС AssignCommand(oPC, ActionSpeakString("Ну, ванючка! Держись!")); // Тут наоборот, жду когда повернетсЯ и ТОГДА ответит AssignCommand(oNPC, ActionForceMoveToObject(oPC, FALSE, 1.0, 15.0)); AssignCommand(oNPC, ActionStartConversation(oPC)); AssignCommand(oNPC, ActionDoCommand(SetCommandable(TRUE, oNPC))); // Убедительно просим оНПС подойти к РС и сказать что велено! И не ЗАБЫТЬ! DelayCommand(0.3, SetCommandable(FALSE, oNPC)); // типа что бы не забыл SetLocalInt(OBJECT_SELF, "TRIGGERED", 1); // Запомним что это ужо было } |
Какой тригер поставить, чтобы игрок случайно на него зашел, не видя сам тригер?
Заранее благодарен
-fenix-
Jun 24 2005, 10:19
SERGO для таких вопросов есть специальные темы в этом разделе: скрипты и вопросы новичков и зачем создавать две темы, отредактируй старое сообщение если нужно.
QUOTE |
1) как после диалога включить у НПС анимацию смерти? |
В слот совершенные действия, на любую строчку диалога
Neverwinter Script Source |
void main() { object oNPC = GetObjectByTag("ТАГ НПС"); effect oEf = EffectDeath(TRUE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, oEf,oNPC); } |
QUOTE |
2) В проклятье Левора, когда в начале дядька умирает, появляется призрак, а потом прыгает вверх и исчезает. Как показать это в скриптах? |
Я в проклятье не играл

, опиши по лучше или посмотри в ПЛ как это сделанно.
QUOTE |
Какой тригер поставить, чтобы игрок случайно на него зашел, не видя сам тригер? |
Тригер невидем, выделяются только тригеры с переходом в другую область.
Бери любой тригер и в OnEnter ставь этот скрипт.
SERGO, пока устное предупреждение (за создание темы без предварительного ознакомления с правилами раздела).
В след. раз будет раельное.
Я ставлю триггер генераций, но когда захажу на тригер, почемуто срабатывает ловушка и я побит этой проблемой
Агрессинг
Jun 24 2005, 13:27
SERGO
Какая ловушка? Может ты эффект смерти с ловушкой путаешь? Эффект смерти это когда герой умирает, а анимация смерти - когда падает и заданное время валяется на земле. Может тебе нужна именно анимация?
Buldog
Jun 24 2005, 13:51
А зачем ты ставишь тригер ловушки? Тебе нужен тригер типа Generic.
Вот че! Я ставля тригер генерации. Написано родовой. Настраиваю скрипт

(см. выше) Нажимаю ОК. Но когда опять захожу в свойства тригера он пишет не родовой а Ловушка!
Агрессинг
Jun 24 2005, 14:02
SERGO
Сделай триггер Новый общий и на onEnter ставь скрипт. Проблем просто быть не может.
Тут еще пара вопросиков:
Как расставлять waypoint на карте?
Как прописать скрипт, чтобы НПС все время ходил по двум, трем... вайпоинтам без остановки.
Как прописать скрипт, чтобы НПС ходил по 2, 3 вайпоинтам например туда обратно 2 раза.
И еще, как прописать следующие. Охранник стоит на посту весь день, как тока начинается ночь, из двери выходит другой охранник, говорит "Иди! Моя смена!". Первый охранник уходит, а второй встает на его место и всю ночь там тарчит, потом они опять меняются, и так до бесконечности.
Как вставлять НПС анимацию, например просто ходит НПС (!без разговора!) и пьет!?
Заранее благодарен!!!
Archangel
Jun 24 2005, 21:23
QUOTE |
Как расставлять waypoint на карте? |
Что ты подразумеваешь под Вэйпоинтами? Точки маршрута, столы, стулья и т.д.?
Если точки маршрута, то в редакторе жми ВОЛШЕБНИЦЫ=>МАСТЕР ПУТЕЙ.
QUOTE |
Как прописать скрипт, чтобы НПС все время ходил по двум, трем... вайпоинтам без остановки. |
Вставляешь в OnHearBeat NPC такой скрипт:
Neverwinter Script Source |
void main() { object oWP1= GetWaypointByTag("ТЭГ_ПЕРВОГО_ВЭЙПОИНТА"); object oWP2= GetWaypointByTag("ТЭГ_ВТОРОГО_ВЭЙПОИНТА"); ActionForceMoveToObject(oWP1); ActionForceMoveToObject(oWP2); } |
QUOTE |
Как прописать скрипт, чтобы НПС ходил по 2, 3 вайпоинтам например туда обратно 2 раза. |
Смотри скрипт выше.
QUOTE |
Как вставлять НПС анимацию, например просто ходит НПС (!без разговора!) и пьет!? |
В OnHearBeat (или OnSpawn) NPC вставляей этот скрипт:
Neverwinter Script Source |
void main { ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK); } |
QUOTE |
И еще, как прописать следующие. Охранник стоит на посту весь день, как тока начинается ночь, из двери выходит другой охранник, говорит "Иди! Моя смена!". Первый охранник уходит, а второй встает на его место и всю ночь там тарчит, потом они опять меняются, и так до бесконечности. |
Нужен вот такой скрипт:
Neverwinter Script Source |
void main() { object oNPC1 = GetObjectByTag("ТЭГ_ПЕРВОГО_ОХРАННИКА"); object oNPC2 = GetObjectByTag("ТЭГ_ВТОРОГО_ОХРАННИКА"); object oWP1= GetWaypointByTag("ТЭГ_ВЭЙПОИНТА_НА_УЛИЦЕ"); object oWP2= GetWaypointByTag("ТЭГ_ВЭЙПОИНТА_В_ЗДАНИИ(которому принадлежит дверь)"); object oDoor = GetObjectByTag("ТЭГ_ДВЕРИ"); if (GetIsDay() && GetLocalInt(oNPC1, "Day") != 1) { DelayCommand(1.0, AssignCommand(oNPC1, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0))); DelayCommand(5.0, AssignCommand(oNPC1, ActionJumpToObject(oWP2))); DelayCommand(9.0, AssignCommand(oNPC1, ActionForceMoveToObject(oNPC2,FALSE, 1.0, 7.0))); DelayCommand(1.0, AssignCommand(oNPC2, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0))); DelayCommand(5.0, AssignCommand(oNPC2, ActionJumpToObject(oWP1))); SetLocalInt(oNPC1, "Day", 1); SetLocalInt(oNPC1, "Night", 0); return; } if (GetIsNight()&& GetLocalInt(oNPC1, "Night") != 1) { DelayCommand(1.0, AssignCommand(oNPC2, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0))); DelayCommand(5.0, AssignCommand(oNPC2, ActionJumpToObject(oWP2))); DelayCommand(9.0, AssignCommand(oNPC2, ActionForceMoveToObject(oNPC1,FALSE, 1.0, 7.0))); DelayCommand(11.0, AssignCommand(oNPC2, SpeakString("Иди отдыхай. Теперь моя смена."))); DelayCommand(13.0, AssignCommand(oNPC1, ActionForceMoveToObject(oDoor,FALSE, 1.0, 7.0))); DelayCommand(17.0, AssignCommand(oNPC1, ActionJumpToObject(oWP1))); SetLocalInt(oNPC1, "Day", 0); SetLocalInt(oNPC1, "Night", 1); return; } } |
Это очень упрощенная версия скрипта. Может найдутся люди, которые напишут его подробнее, а у меня сейчас времени нет.
З.Ы.:
Также не исключаю наличие ошибок в скриптах. Тулсета под рукой нет.
SERGO не мучайся сам и не мучай нас переводом тулсета. Там такая чушь... Ставь английский и делай, а играть можешь на русском.
Tiger Greyhawk
Jun 25 2005, 04:45
QUOTE (Archangel @ Jun 24 2005, 22:23) |
. QUOTE | Как прописать скрипт, чтобы НПС все время ходил по двум, трем... вайпоинтам без остановки. |
Вставляешь в OnHearBeat NPC такой скрипт: Neverwinter Script Source | void main() { object oWP1= GetWaypointByTag("ТЭГ_ПЕРВОГО_ВЭЙПОИНТА"); object oWP2= GetWaypointByTag("ТЭГ_ВТОРОГО_ВЭЙПОИНТА"); ActionForceMoveToObject(oWP1); ActionForceMoveToObject(oWP2); } |
|
1. Таким образом очень быстро забьется стек акций патрулируещего.
2. Патрулирующий ни на что не будет реагировать. Даже если его будут убивать...
Есть функция WalkWayPoints. Через нее и надо делать, имо. Она требует #include "NW_I0_GENERIC"
Как ею пользоваться: просто создать вейпы с тагами "WP_" + таг патрулируещего + "_0#". Например: "WP_NPC_01", "WP_NPC_02" и т.д.
А когда надо заставить непися начать ходить по ним: WalkWayPoints(FALSE, 1.0); (в OnSpawn стандартных неписей это, вроде, уже даже раскоментировано) FALSE - ходить, TRUE - бегать. 1.0 - пауза в секундах между следованием к след. вейпу.
Спасибы, чбы я без вас делал!
Добавлено в [mergetime]1119674528[/mergetime]
А как сделать, чтобы вот эта анимация питья делалась очень редко! А то она уж слишком частая!
Добавлено в [mergetime]1119674632[/mergetime]
и вот еще
Tiger Greyhawk
Я делал по твоей инструкции, и получилось так, что НеПиСь при попытке разговора поворачивается, есть диалог, а дальше он по точкам не ходит. Как сделать чтобы он и далльше ходил? (после диалога)