Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
dumbo
Kavin, твоя ошибка в выборе события - OnPerception срабатывает когда игрок входит/выходит в/из зоны видимости/слышимости стражника. т.е. твой скрипт будет работать только в тех случаях, когда игрок уже дрыхнет где-то, а стражник, подходя, замечает его.
нужно вешаться на OnHeartBeat(аналогично тому, как ты вешался на персепшн, т.е. после вызова nw_c2_default1) и там проверять, находится ли игрок в пределах видимости и его состояние. и там уже пинать бомжа. crazy.gif
Lex
другой вариант это при старте реста поиск стражников ближайших, которые игрока видят. Ну и далее по твоему сценарию. Так имхо экономичнее, чем хб стражи грузить
Kavin
Lex, как повесить скрипт на стражника, я знаю, а вот как выполнять скрипт при старте Rest-а игрока?.. Его-то слотов я не вижу.

dumbo, Спасибо. Способ подходящий, кажется. Единственное, что меня смущает, что OnHeartBeat происходит каждые 6 секунд, и пока стражник одуплится и добежит, ты уже отдохнешь и под шумок свалишь, особенно если низкоуровневый персонаж...
А стражник тебя догонит, высунув язык на плечо, и скажет: "Низзя! Было тут отдыхать...".
И все, хотя главная задача - помешать игроку отдохнуть.

Была немного другая затея - когда игрок садится отдыхать, рядом с ним, шагах в 10-20, в случайном направлении, создавать Waypoint, телепортировать из казармы патруль, давать ему команду "К бомжу бегом марш!", и далее - мешать игроку отдыхать.
Что мне помешало:
1. Не умею еще отлавливать начало отдыха игрока.
2. Думаю, помучившись, я бы сумел расположить Waypoint на расстоянии 10-20 шагов в случайном направлении. Но если игрок сядет отдыхать на краю карты, то стражу может забросить на макушки деревьев или вообще куда-то нафиг.
Предполагаемые выходы из ситуации:
а) понатыкать на карте Waypointов, и определять ближайший, к нему стражу и телепортировать. Но тогда получается слишком много объектов?.. При размере карты, скажем 12 на 12 надо будет минимум 144 waypointa.
б) При расположении Waypointа проверять, не вышел ли он за пределы локации, и в соответствии с этим корректировать координаты.
Однако я не умею проверять, не попал ли Waypoint за границу...
Может быть, подскажет кто функции нужные?..
Lex
QUOTE (Kavin @ Nov 5 2005, 23:17)
1. Не умею еще отлавливать начало отдыха игрока.

свойства модуля - события - onPCRest
QUOTE (Kavin @ Nov 5 2005, 23:17)
2. Думаю, помучившись, я бы сумел расположить Waypoint на расстоянии 10-20 шагов в случайном направлении. Но если игрок сядет отдыхать на краю карты, то стражу может забросить на макушки деревьев или вообще куда-то нафиг.

функция CreateRandomLocation (есть в базе) + проверка на валидность координаты (тут придется наверное параметры локи занасить в локалки этой самой локи. По сути надо знать ширину и длину в тайлах и умножить то ли на 10, то ли на 15, чтобы получить коорлинаты.. я уж не помню ну и далее очевидно.. Проблемы это тем не менее полностью не решает)
QUOTE (Kavin @ Nov 5 2005, 23:17)
а) понатыкать на карте Waypointов, и определять ближайший, к нему стражу и телепортировать. Но тогда получается слишком много объектов?.. При размере карты, скажем 12 на 12 надо будет минимум 144 waypointa.

хороший вариант. Канает. Но только наф так много? Прикинь локу города... поставь там всего то 10-20 поинтов и ты покроешь всю основную зону. не надо стремиться делать 1 поинт на тайл, лучше распологать их более рационально.. у дверей, закоулвок и прочих мест, откуда стражник мог появиться незамечанным)
QUOTE (Kavin @ Nov 5 2005, 23:17)
б) При расположении Waypointа проверять, не вышел ли он за пределы локации, и в соответствии с этим корректировать координаты.

??? если у тя стоят поинты, провека не нуна. Они ж на нормальных местах стоят.



че-то меня седня на большой пост развезло.. молчанка на пару дней..
Kavin
QUOTE (Lex @ Nov 5 2005, 22:32)
хороший вариант. Канает. Но только наф так много? Прикинь локу города... поставь там всего то 10-20 поинтов и ты покроешь всю основную зону. не надо стремиться делать 1 поинт на тайл, лучше распологать их более рационально.. у дверей, закоулвок и прочих мест, откуда стражник мог появиться незамечанным)


Согласен с тобой, однако местность - не город, а хутор, и если я сяду на краю карты отдыхать, то стража не успеет добежать до меня из ближайшего закоулка.
Кроме того, я подумал сегодня и забраковал этот вариант по той причние, что если я сяду отдыхать прям у невидимого Вэйпойнта, то стража "появится из сумрака" прямо около меня. Некузяво. Ночной дозор, блин. yes.gif
Так что остается только случайное расположение Вэйпойнта. В принципе, сейчас найду функцию RandomLocation и разберусь.
О результатах отпишу. pardon.gif
Белатрис
Вот описание скрипта который мне нужен:
Когда 4 предмета(допустим с тагами 1 , 2 , 3 и 4) попадут на алтарь( с тагом Aktar_01 ) то на него производится эфект(как при лечении(я имею ввиду лучь оква-голубой))и с двери(таг Door_Sklep_01_12 ) снимается супер-пупер необезреживающаяся ловушка.
Lex
ну и где проблема?
все, что надо для

1. снятия ловушки
Neverwinter Script Source
// Disable oTrap.
// - oTrap: a placeable, door or trigger.
void SetTrapDisabled(object oTrap)

2. эффека
наложение:
Neverwinter Script Source
// Apply eEffect to oTarget.
void ApplyEffectToObject(int nDurationType, effect eEffect, object oTarget, float fDuration=0.0f)

сам эффект:
Neverwinter Script Source
// * Create a Visual Effect that can be applied to an object.
// - nVisualEffectId
// - nMissEffect: if this is TRUE, a random vector near or past the target will
//  be generated, on which to play the effect
effect EffectVisualEffect(int nVisualEffectId, int nMissEffect=FALSE)

константы эффектов:
Neverwinter Script Source
VFX_IMP_HEALING_G
VFX_IMP_HEALING_L
VFX_IMP_HEALING_M
VFX_IMP_HEALING_S
VFX_IMP_HEALING_X


как делать:
в закладку onDisturbed обрабатываешь работу с вещами, оперируя этим:
Neverwinter Script Source
// Get the last object that disturbed the inventory of the caller.
// * Returns OBJECT_INVALID if the caller is not a valid creature or placeable.
object GetLastDisturbed()

// Get the type of disturbance (INVENTORY_DISTURB_*) that caused the caller's
// OnInventoryDisturbed script to fire.  This will only work for creatures and
// placeables.
int GetInventoryDisturbType()

// get the item that caused the caller's OnInventoryDisturbed script to fire.
// * Returns OBJECT_INVALID if the caller is not a valid object.
object GetInventoryDisturbItem()




\\ скрипт пишется за 2-3 минуты максимум. Время пошло.
Белатрис
А как проверка делается, а то я уже пол часа сижу со статьей и ничего не могу придумать!
Lex
варианты:

1.
- на ивент INVENTORY_DISTURB_ADDED проверять, если добавили вещь с нужным тегом, то локалку соотв. сделать +1. Убрали -1. Или делать локалку-состояние.. описал ниже ее. (причем я не наю, как у тебя с уникальностью вещей.. но можно сделать проверку на дубли)
- как только локалка стала = 4 то соотв эффект и ловушка.

2. после каждого изменения инвентаря алтаря (ADDED или REMOVED.. не суть, можно не проверять даже) пробегаешься по вещам, что там есть и формируешь локалку (либо как выше, либо локалку-состояние.. например 1111 значит, что все есть... 1011 значит, что нет второй вещи.. ну и тд.) и проверяешь в конце..
Kavin
Lex, послушай, я немного запутался.
Тип данных Location - это типа "Место с координатами Х, У, Z", или именно игровая локация?..
AliceDiren
Kavin, скачай себе Lexicon. Очень полезная вещь.
Neverwinter Script Source
location loc = Location(objArea, vecPosition, fFacing);

и функция
Neverwinter Script Source
location Location(
    object oArea,
    vector vPosition,
    float fOrientation
);

QUOTE

oArea
An Area within the game module

vPosition
An object specifying an xyz coordinate

fOrientation
An angular value between 0.0 and 360.0
Kavin
Угу. Ясно! Location - тип данных, полностью описывающий месторасположение объекта.

Лексикон качаю. Безуспешно - уже 4-й раз, с разных ссылок... swoon.gif
Лито
Объясните мне пожайлуста shout.gif Почему при использовании функции - AddJournalQuestEntry, с целью добавить ступень в журнале, которая завершает категорию, мне не выдают опыт, который я назначаю.(в поле свойств категории)

Приведу более широкий пример.
Neverwinter Script Source
if(sTag == "KEY_PERSONAL1")
{
AddJournalQuestEntry("KEY_QUEST",2,oPC);
}

Игроку дают квест - найти ключик.
Добавляется запись в журнал(с этим проблем нет) - далее игрок находит ключ - квест завершается и запись в журнале переходит в закладку "выполненые", но опыта за завершенную категорию не дают this.gif
Lex
QUOTE (Nick Parker @ Nov 5 2005, 07:13)
4)При создании квеста, вешаемого на ветку диалога, когда пишешь ему имя, тэг, приоритет, ниже есть ХР. Что это? Думал опыт, но при прохождении опыт не дают. Приходится через «дать награды».

QUOTE (Dik Morris @ Nov 5 2005, 08:56)
GetJournalQuestExperience

и сами даем опыт.

Лито, с такими вопросами в ОДИНОЧНЫЕ ВОПРОСЫ или Вопросы Новичков, а не сюда.
\\ кстати ответ взят оттуда, с последней страницы, так что.. выводы сам делай.
Добавлено в [mergetime]1131304925[/mergetime]
Kavin, тебе кстати тоже.
Лито
Гм...тогда придется писать проверку, чтобы опыт давался только один раз. unsure.gif
Эх...ладно.
Daemonix
Ну кто-нибудь, помогите! this.gif
Neverwinter Script Source
void main()
{
    object oMod = GetModule();
    object oPC = GetEnteringObject();
  if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME"))
      {return;}
      {
      SetLocalInt(oMod, "START_GAME", TRUE);
}
TakeGoldFromCreature(GetGold(oPC),oPC, TRUE);
object oChest = GetObjectByTag("startchest");
object oItem = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItem))
        {
            CopyItem(oItem, oChest, FALSE);
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
        }
  int i=0;
        while(i<14)
        {
        DestroyObject(GetItemInSlot(i, oPC));
        i++;

        }
}

Ну и так и так делал, все деньги у игрока НИ В КАКУЮ не забирает!
Ошибок тут нет, но вот не забирает деньги и всё, хотя строка такая есть...
Lex
Мля.. не первый раз уже такое.. Daemonix

функция:
Neverwinter Script Source
void TakeGoldFromCreature(
    int nAmount,
    object oCreatureToTakeFrom,
    int bDestroy = FALSE
);


из Лексикона
QUOTE

Description
Take nAmount of gold from oCreatureToTakeFrom.

The taker needs to be a non-area and non-module for it to work correctly. It can be the creature passed into oCreatureToTakeFrom, of course.


ну народ, блин, rtfm.gif
KoYuKi
Друзья, есть у меня проблема, вобщем есть два города, допустим город А и город В, в окрестностях каждого города 6 лок, между городами можно передвигаться. Так вот, как сделать так чтобы если вы умерли в одной из шести лок города А, то вы появлялись в храме города А, а если в одной из 6 лок города В то в храме города В.
Я как то раз уже спрашивал про это дело в разделе Шарды Рунета, тогда мне никто толком ниче не разъяснил, может поможете?
dumbo
KoYuKi
в скрипте OnPlayerDeath добавь:
Neverwinter Script Source
//----
object oPC = GetLastPlayerDied();
// все тэги тут писать ЗАГЛАВНЫМИ буквами (чтоб избежать путаницы)
string sResWPtag = "тэг вэйпоинта для реса по умолчанию";
string sArea = GetStringUpperCase(GetTag(GetArea(oPC)));
if (FindSubString("тут через пробелы тэги лок вокруг А", sArea) != -1)
  sResWPtag = "тэг вэйпа в храме A";
else if (FindSubString("тут через пробелы тэги лок вокруг B", sArea) != -1)
  sResWPtag = "тэг вэйпа в храме B";
ActionJumpToLocation(GetLocation(GetObjectByTag(sResWPtag)));
//-----


edit: ой, ой. облажался blush.gif - OnPlayerDeath идет на модуле ж... не OBJECT_SELF, а GetLastPlayerDied(). thx 2 AliceDiren wink.gif
AliceDiren
KoYuKi, самый простой вариант - проверять таг локи, в которой умер персонаж.
В скрипте на OnPCDeath
Neverwinter Script Source
//...
object oPC = GetLastPlayerDied;
string sAreaTag = GetTag(GetArea(oPC));
if(sAreaTag = "area001" ||
    sAreaTag = "area002" ||
    sAreaTag = "area003" ||
    sAreaTag = "area004" ||
    sAreaTag = "area005" ||
    sAreaTag = "area006") {/*Перемещаем в город A*/}
if(sAreaTag = "area011" ||
    sAreaTag = "area012" ||
    sAreaTag = "area013" ||
    sAreaTag = "area014" ||
    sAreaTag = "area015" ||
    sAreaTag = "area016") {/*Перемещаем в город B*/}
//...
Lex
QUOTE (AliceDiren @ Nov 10 2005, 21:00)
KoYuKi, самый простой вариант - проверять таг локи, в которой умер персонаж.
В скрипте на OnPCDeath

мм... имхо этот вариант проще и малек удобнее:

Neverwinter Script Source
///
object oPC = GetLastPlayerDied();
object oRP = GetNearestObjectByTag("RP",oPC);
object oRespawnPouint = GetObjectByTag(GetName(oRP));
AssignCommand(oPC,ActionJumpToLocation(oRespawnPouint));
///


Что мы имеем.
В каждой локации ставим Waypoin с тэгом "RP" и именем = тэгу точки респауна.
И все... Берется поинт, по имени берется другой поинт и мы туда джампаемся.
Думаю все локации пометить такими поинтами - не проблема.
(можно сделать, что в локации будет храниться локалка, но имхо ставить поинты проще.. не надо никуда лазать.)

+ что добавление новых областей и новых мест респауна не требует изменения скрипта. Просто поставь поинты в локацию и все (имеет смысл сделать их в палитре).



имхо
Добавлено в 21:20
QUOTE (dumbo @ Nov 10 2005, 20:59)
edit: ой, ой. облажался blush.gif - OnPlayerDeath идет на модуле ж... не OBJECT_SELF, а GetLastPlayerDied(). thx 2

QUOTE (dumbo @ Nov 10 2005, 20:59)
ActionJumpToLocation(GetLocation(GetObjectByTag(sResWPtag)));

не до конца поправил
Добавлено в 21:24
QUOTE (KoYuKi @ Nov 10 2005, 20:40)
Я как то раз уже спрашивал про это дело в разделе Шарды Рунета, тогда мне никто толком ниче не разъяснил, может поможете?

тебе посоветовали, как сделать. Причем в том же ключе, в каком тут скрипты написаны.



ЗЫ: вопрос - 3 ответа от мастеров... ГЫ biggrin.gif
dumbo
offtopic.gif (маленький и незаметный)
QUOTE (Lex @ Nov 10 2005, 22:10)
ЗЫ: вопрос - 3 ответа от мастеров... ГЫ

и, что характерно, все написаны в блокноте и нерабочие... crazy.gif
KoYuKi
Спасибо всем, но вот насчёт блокнота это проблема, тогда мне тоже дали такой ответ как Lex, вот только он был не рабочий... щас этот проверю
Lex
это куски кодов. Доводи их до состояния скриптов уже сам. Сам не научишься - мы за тебя все скрипты в модуль не напишем же.
С твоей стороны надо чуть больше, чем "дайте мне скрипт". Тем более в такой теме, где задаются вопросы и просятся советы

KoYuKi
Lex да я то понимаю что это куски кодов, вот только куда эти коды писать, всмысле как, по каким законам, относительно чего... я с учебником по скриптингу довольно долго возился, порядка пары месяцев, но так толком ничего в C++ и не понял, так основы... видать не моё это...
Kavin
KoYuKi, не отступать и не сдавацца!
Попробуй сначала изучить абстрактную объектно-ориентированную технологию, без привязки к определенному языку.
События, свойства, классы, инкапсуляция, перекрытие и т.п. - усвой все это.
Я, пока не прошел курс основ Объектно-Ориентированного Прогарммирования (оООП), тоже нифига не понимал и бросил скриптинг аж на 8 месяцев.

Дело в том, что в случае NWNа объекты очень сильно замкнуты в себе, и чтобы манипулировать ими, ты должен на интуитивном уровне понимать, кто кому и кем приходится....
Непонятно сказал, кажись...

Поясняю: если объект замкнут в себе, достучаться до него и использовать можно только через события...
Чтобы из него достучаться до другого объекта, нужно определить, кем приходится тот объект этому.... Damager-ом, Killer-ом, EnteringObject-ом....

Я, лично, C++ в глаза никогда не видел, но это мне нимало не мешает.
azathoth
Ну ООП для скриптинга не необходимость. NWScript (или как он там) процедурный язык, хотя "абстрактнуя объектно-ориентированную технология", конечно, тоже не помешает, даже поможет.

Куда эти коды писать, всмысле как, по каким законам, относительно чего:

1. Понять что надо (если сумел написать, что надо - значит уже понял что надо делать на шаг ближе к скрипту).
2. Алгоритм -- перед тем как доверить гудящему монстру что-то считать подумай, что бы ты сам сделал чтобы решить эту задачу.
Например: "Есть два города, допустим город А и город В, в окрестностях каждого города 6 лок, между городами можно передвигаться. Так вот, как сделать так чтобы если вы умерли в одной из шести лок города А, то вы появлялись в храме города А, а если в одной из 6 лок города В то в храме города В?"
Выше было предложено три варианта:
а) находим место, где умер персонаж, если тэг этого места находится в списке 1, переносим в точку А, если в списке 2, переносим в точку B, если ни в каком списке нет, переносим в точку С.
б) находим место, где умер персонаж, есил это тег Т1, Т2, T3, Т4, Т5 или Т6 -- переносим в точку А, если это тэг Т7, ... , Т12 -- в точку В. Ну и про запасной вариант не забудем -- если ни там - ни там, сообщим игроку, что его сьели гулли месяц спустя после кончины, ибо в такую жопь ему взбрело в голову забрести, и прежде времени избавляем его от мучений.
в) находим ближайшую точку, где можно возродится и переносим умершего туда.
Алгоритм выбираем тот, который кажется наиболее естественным (но это уже на любителя).
3. Вот только теперь берем книжицу и ищем как те же самые мысли написать с помощью предоставленых команд и функций. Я первые три дня знакомства со скриптами НВН только и делал, что читал описания функций, ищя названия тех, что выполняли нужные мне действия.
Пример: "Находим место, где умер персонаж."
используем функцию GetArea(), возвращающую область в которой находится объект (в частности персонаж); под тем что место найдено также подразумевается, что мы его запомним (иначе как бы мы далее искали его тэг) для етого создаем переменную (читаем книжицу много-много раз, иначе никак).
4. Используем шаг 3. до посинения -- читаем описание языка, просматриваем действие функций, пытаемся с помощью них воплотить аглоритм.
Lex
"Скрипты, Все вопросы и ответы по скриптам"
Давайте не будем вдаваться в азы програмирования и то, как надо алгоритмизировать задачу и потом ее програмировать.
Vhall
Существует задача запрещения использования лечебных спеллов (всех из healing subschool, за исключением Rise Dead и Resurrect) на определенной расе.
Допустим, кастанул cure light wounds – эффекта ноль + StrRef-сообщение.
Может кто теорией помочь?
Lex
-----------
вариант номер 1 "геморойный"
Правка скриптов соотв. заклов. Не так сложно (точнее очень просто), но мутно. Хотя там вроде всего то с 10-ок спеллов поправить.
Добавление проверки и отправка сообщения.
Neverwinter Script Source
if (GetRacialType(oTarget)==XXXX) { SendMessageToPC(oCreator,"TEXT"); return;}

Пишу тут на форуме, не в тулсете (с)
-----------
вариант номер 2 "ущербный"
Повесить на цель шкурку (если есть уже, то добавить свойства) с имунами к определенным заклам.
Ущербность в том, что сообщения не будет.
-----------
Vhall
Ага, спасибо, Лекс. Думаю остановиться на правке заклов.
------------------------------
Какие имеются варианты добавления персу Damage Reduction (а-ля поглощение варвара)?;
Варианты добавления, не зависящего от других факторов, AC (Natural?!)

И еще. Можно ли оперировать Spellcasting Failure? Добавлять свойство вещи, изменять значение (да\нет)
Lex
QUOTE (Vhall @ Nov 12 2005, 18:37)
Какие имеются варианты добавления персу Damage Reduction

через добавку на шкурку свойств.

QUOTE (Vhall @ Nov 12 2005, 18:37)
И еще. Можно ли оперировать Spellcasting Failure?

можно.
Можно сделать, скажем, крутой кинжал для мага, который мешает кастовать. Применяй как хочешь

Добавлено в [mergetime]1131810152[/mergetime]
это не совсем скриптовые вопросы.. в Одиночные скорее
_kaa_
QUOTE (Vhall @ Nov 12 2005, 16:43)
Существует задача запрещения использования лечебных спеллов (всех из healing subschool, за исключением Rise Dead и Resurrect) на определенной расе.
Допустим, кастанул cure light wounds – эффекта ноль + StrRef-сообщение.
Может кто теорией помочь?

Чтобы не править скрипты спеллов - поправь один скрипт, spellhook кажется называется. С HoTu все спеллы вызывают его перед запуском любого спелла. Там ты можешь узнать и расу кастера, и ID спелла, отменить его и выдать сообщение.
Vhall
Дык, забыл я, конечно, уточнить что предпочтительны скриптовые решения. pardon.gif
QUOTE (Lex @ Nov 12 2005, 18:42)
через добавку на шкурку свойств.

Так скриптами никак? Я не очень хочу редактировать itemprops* и перескприпчивать шаги. Вот и ищу рациональное решение.
QUOTE (Lex @ Nov 12 2005, 18:42)
Можно сделать, скажем, крутой кинжал для мага, который мешает кастовать. Применяй как хочешь

Угумс, довелось видать такую вкладку на айтеме - Properties. Можно ли назначить ScF _без_ свойсва вещи?
Добавлено в [mergetime]1131819169[/mergetime]
_kaa_, благодарю
Lex
QUOTE (Vhall @ Nov 12 2005, 21:11)
Угумс, довелось видать такую вкладку на айтеме - Properties. Можно ли назначить ScF _без_ свойсва вещи?

эффектами на игрока.


Каа, ага, я про спеллхук забыл совершенно smile.gif
Ashram
Здравствуйте.
У меня такой вопрос:
Как сделать, чтобы при взломе двери игроком, находящиеся рядом охранники НПС становились для него враждебными, и нападали?
Lex
QUOTE (Ashram @ Nov 13 2005, 15:45)
Как сделать, чтобы при взломе двери игроком, находящиеся рядом охранники НПС становились для него враждебными, и нападали?

скриптами на слоты onDamage onUnLock двери.
логика там простая: берем дамагера/анлокера и натравливаем на него охрану, что рядом.
функции:
Neverwinter Script Source
object GetLastDamager(object oObject=OBJECT_SELF)

object GetLastUnlocked()

object GetObjectByTag(string sTag, int nNth=0)

void DetermineCombatRound(object oIntruder = OBJECT_INVALID, int nAI_Difficulty = 10)


Добавлено в [mergetime]1131887341[/mergetime]
с такими вопросами малек не сюда. Тривиальные скрипты и прочие начальные вопросы в тему "Вопросы новичков".
+ посмотри обязательно тему "Вопросы и Ответы". Там же есть ссылка на туториал. Читать обязательно.
-fenix-
Хм, такой вопросик.
Как отследить, кто первым начал бой, герой или НПС?
Aiwan
QUOTE (-fenix- @ Nov 14 2005, 02:18)
Как отследить, кто первым начал бой, герой или НПС?

Ну НПС редко сам нападает smile.gif Говори нормально. Где отследить, на шарде или сингл. Ситуацию... Как первый раз за мужем.
Lex
хм.. по идее в слоте onAttack NPC смотрим. Если во время атаки игрока НПС нейтрален и не в бою, то игрок по идее напал первый.
-fenix-
QUOTE (Lex @ Nov 14 2005, 01:02)
хм.. по идее в слоте onAttack NPC смотрим.

Неа Лекс, не прет.
Ведь слот запускается не при клике на атаку. Ну, когда нажимаешь мирного атаковать. А в момент удара и вэтот же момент НПС становется враждебным и боевым. При чем это происходит раньше, чем проверка в слоте.
Вот это не пашет
Neverwinter Script Source
void main()
{
object oPC = GetLastAttacker();
int iPCvsNPC = GetReputation(OBJECT_SELF, oPC);

if(iPCvsNPC > 10)
{
SpeakString("FEfef");
}
}

А это пашет
Neverwinter Script Source
void main()
{
object oPC = GetLastAttacker();
int iPCvsNPC = GetReputation(OBJECT_SELF, oPC);

if(iPCvsNPC < 11)
{
SpeakString("FEfef");
}
}

Так, точно пора отдыхать crazy.gif

QUOTE (Aiwan @ Nov 14 2005, 00:40)
Ну НПС редко сам нападает

Угу. Видимо прейдется учитывать экстренные моменты, когда НПС сам начинает бой, при смерти НПС. Например, атака не там заснувшего ПС.

QUOTE (Lex)
Cдается место. Дорого.

За сколько blush.gif
2_advanced
QUOTE
-----------------------------------
|                                |
|  Тут могла быть ваша реклама    |
|                                |
-----------------------------------
покупайте наших слонов, наши слоны самые слоничтые слоны в мире shok.gif

Neverwinter Script Source
if(iPCvsNPC > 10)

не хостайловый
Neverwinter Script Source
if(iPCvsNPC < 11)

хостайловый...

-fenix-
QUOTE (2_advanced @ Nov 14 2005, 03:31)
не хостайловый

QUOTE (2_advanced @ Nov 14 2005, 03:31)
хостайловый...

Эм, не понял, что есть хостайловый sorry.gif

Kavin
Фракция Hostile (Хостайл) - "враждебный".
2_advanced
в смысле если ПС ударил НПС, то НПС становится враждебным diablo.gif при этом ставить на ПЦ флаг напавшего
а если моб первым начал, то это можно узнать, изменив функцию DetermineCombatRound (или что-то типа того..)
(проверку на нападение со стороны ПЦ - если флага нет, то моб начал shok.gif )
Kavin
QUOTE (Kavin @ Nov 6 2005, 11:09)
Кроме того, я подумал сегодня и забраковал этот вариант по той причние, что если я сяду отдыхать прям у невидимого Вэйпойнта, то стража "появится из сумрака" прямо около меня. Некузяво. Ночной дозор, блин. 
Так что остается только случайное расположение Вэйпойнта. В принципе, сейчас найду функцию RandomLocation и разберусь.
О результатах отпишу. 


Отписываю о результатах.
Все ништяк.
Функция RandomLocation, как я и предполагал, работает даже без проверки верного местоположения.
Просто движок не позволяет объекту создаться за пределами карты или на недоступном месте.

Теперь стража появляется шагов за 10 от PC и подбегает к нему.
Предупреждает три раза, на четвертый раз - убивает нафиг.

Если игрок отбежал чуть дальше и снова сел - его догоняют два предыдущих стражника.
Если отбежал далеко и сел - те двое уничтожаются, и появляются два новых, снова в 10 шагах.

Lex, стоит лит этот скрипт в базу выложить?..
Aiwan
QUOTE (Kavin @ Nov 14 2005, 10:18)
Lex, стоит лит этот скрипт в базу выложить?..

Выложи тут мы посмотрим.

-fenix- вот я лично так и не понял зачем тебе узнавать кто напал первый. НПС сам не нападет, если РС не натворит дел. Соответсвенно, узнать кто первый дал по башке можно, но опять же, если НПС стоял и РС его тюкнул и не попал, то НПС не будет враждебным. (Помоему...) И эту тему уже разбирали где-то. Элементарное узнать кто начал невозможно. Можно конечно повесить на оружие евант, тюкнул по цели и записываем на нее имя, кто тюкнул и когда. Соответсвенно сверяем двух провенившихся и вычисляем кто виноват. Но это имхо не верно по соображениям морали. this.gif Мы узнаем только КТО ПЕРВЫЙ УДАРИЛ. Но начать может тот кого спровоцировали. aggressive.gif
Добавлено в [mergetime]1131945069[/mergetime]
QUOTE (Aiwan @ Nov 14 2005, 11:08)
Мы узнаем только КТО ПЕРВЫЙ УДАРИЛ. Но начать может тот кого спровоцировали.

Хотя... smile.gif Как в жизни. Судят кто попал под раздачу. biggrin.gif
-fenix-
QUOTE (Aiwan @ Nov 14 2005, 09:08)
-fenix- вот я лично так и не понял зачем тебе узнавать кто напал первый.

Задумка такая, которая завязана на том, кто первым начал бой. Если ПС и НПС не был врагом и у ПС была одна вещь, то кой чего происходит smile.gif

QUOTE (Aiwan @ Nov 14 2005, 09:08)
если НПС стоял и РС его тюкнул и не попал, то НПС не будет враждебным. (Помоему...)

Неа. Если ПС совершил удар, не важно попал или нет, то раунд уже начался. НПС становется враждебным и долбит ПС.

QUOTE (Aiwan @ Nov 14 2005, 09:08)
Элементарное узнать кто начал невозможно.

Ведат проглядел я тот разговор sad.gif
Но уже и сам понял, что невозможно.
Прейдется просто другие игровые моменты учитывать.
QUOTE (Aiwan @ Nov 14 2005, 09:08)
Судят кто попал под раздачу.

Объясни потом игроку biggrin.gif
Белатрис
Напишите плиз скриптик где НПС нагибается к бассеину и полностью вылечивается(типо как в Принце Персии).
Dik Morris
Поставь скрипт на строчку в диалоге:
Neverwinter Script Source
void main()
{
object oNPC = GetObjectByTag("ТАГ НПС");
object oBass= GetObjectByTag("ТАГ БАССЕЙНА");
effect eHeal = EffectHeal(100);
ActionDoCommand(AssignCommand(oNPC, ClearAllActions()));//Почистим акции у НПС
ActionDoCommand(AssignCommand(oNPC, ActionMoveToObject(oBass,FALSE))); //Подойдем к бассейну
ActionDoCommand(AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0f,5.0f)));//"Копошится"
ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,eHeal,oNPC));//Вылечим НПС
}

ЗЫ: в Принца Персии, я не играл.
ЗЗЫ: сорри, просто скрипт я оч. быстро писал, торопился.
А вы уж, "запинали" crazy.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.