Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты: Все вопросы
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights 2 Obsidian Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7
virusman
ActionTakeItem - это действие, его можно использовать только от имени существ. Модуль (или даже OBJECT_INVALID), от имени которого вызывается OnItemAcquired, не может взять предмет у игрока.
Вместо этого поставь DestroyObject.
В строчке
NSS
AddHenchman(oTaker, oHench);
используется oHench, но она ранее не объявлена и не установлена.
gennady

webkent, слишком много лишнего в твоем коде, для НВН я бы записал так:
NSS
void main()
{
object oTarget = GetModuleItemAcquiredBy();
object oItem = GetModuleItemAcquired();
location Loc = GetLocation(oTarget);
if (GetTag(oItem) == "itm_***") // Лучше определить через тэг
{
  // Сразу определим хенча
  object oHench = CreateObject(OBJECT_TYPE_CREATURE, "c_dogwolfdire", Loc, FALSE, "c_dogwolfdire1");
  AddHenchman(oTarget, oHench);
  DestroyObject(oItem, 3.0); // Удалим с задержкой, чтобы исключить баги
  // На пожарный случай
  DelayCommand(3.0, DestroyObject(GetItemPossessedBy(oTarget, "itm_***")));
}
}

mamuc
QUOTE
ActionTakeItem(oItem, oTaker); //тут вылетает с ошибкой

как говорится не в ту степь попали biggrin.gif
кстати- лучше бы сразу не удалять токо что найденый итем, а сделать процесс подлинее biggrin.gif - этот итем делал бы волка на каком нить алтаре, например, или повесить скрипт одноразового юза на сам предмет - тогда появление волка -хенча будет или у алтаря илии после юза спец свойства итема biggrin.gif

CODE

    CreateObject(nObjectType, "c_dogwolfdire",lLocationOfTaker, FALSE, "c_dogwolfdire1");
     object oHench = GetObjectByTag("c_dogwolfdire1");

..и еще ...а почему 2 строчки biggrin.gif ведь можно и одной biggrin.gif
CODE

    object oHench = CreateObject(nObjectType, "c_dogwolfdire",lLocationOfTaker, FALSE, "c_dogwolfdire1");

а то создание обьекта - процесс сравнительно "громоздкий"( как правило лучше на этом процесе действие скрипта и заканчивать biggrin.gif ), а ты уже ищешь обьект (по тэгу), который еще может и не успел досоздатся biggrin.gif

п.с. пока ходил по делам ( пост не завершил писать) gennady уже об этом написал biggrin.gif
webkent
QUOTE
как говорится не в ту степь попали
кстати- лучше бы сразу не удалять токо что найденый итем, а сделать процесс подлинее - этот итем делал бы волка на каком нить алтаре, например, или повесить скрипт одноразового юза на сам предмет - тогда появление волка -хенча будет или у алтаря илии после юза спец свойства итема


Да там просто магазин петомцев =)
Ок спасибо всем щас буду править.
webkent
И вот что интересно - Я ставлю волка в тулсете, меняю ему некоторые параметры, меняю ТАГ и меняю Тэмплейт. Потом через скрипт хочу создать волка с таким темплейтом(еще одного) а он не создается. Если пробую создать НПЦ со стандартным темплейтом то всё отлично создается. Вот вопрос - что, разве обязательно еще 1 шаблон создавать чтобы потом через скрипт этого НПЦ создать или как-то можно без этого?
-fenix-
Все объекты создаются из палитры по их РесРефу. Тобишь, добавляешь в палитру своего волка, делаешь ему уникальный РесРеф и потом по нему создаешь этого волка где тебе надо. В первом НВН была еще возможность создания копии, хз как тут. Но лучше делай через палитру. Еще, если этот непись тебе нужен тока раз, там по квесту он где появляется или еще чего, то можно его для начала кинуть в закрытую локу, а потом просто переместить куда надо.
webkent
Тупой вопрос: как скриптами убить объект? =)
virusman
Убить или удалить?
Waromon
2 webkent:

Самое простое:
NSS
// Destroy oObject (irrevocably).
// This will not work on modules and areas.
void DestroyObject(object oDestroy, float fDelay=0.0f)

Так же, можно ипользовать эффекты. Например дамага/смерти:
NSS
effect EffectDamage(int nDamageAmount, int nDamageType=DAMAGE_TYPE_MAGICAL, int nDamagePower=DAMAGE_POWER_NORMAL)

NSS
effect EffectDeath(int nSpectacularDeath=FALSE, int nDisplayFeedback=TRUE)

Применяюцца, они с помощью функции:
NSS
ApplyEffectToObject.


Ну либа ApplyEffectAtLocation;
Narruin
Подскажите кто знает как "ловить" (как эвент) момент, когда по игроку бьют?
Нужно для реализации durability на вещах.

Исользование только On Hit Cast Spell : Unique на мэйн арморе не подходит. Вдруг игрок без армора будет бегать smile.gif Тогда шлем, перчи etc. не будут ломаться.
azathoth
Тогда используй On Hit Cast Spell : Unique на оружие.

Еще вариант: на харбите модуля понижать прочность экипировки всем игрокам, находящимся в бою. Не столь реалистично, зато куда менее требовательно к ресурсам, елси игроков много.
Narruin
QUOTE(azathoth @ Jan 13 2007, 17:13) [snapback]102185[/snapback]

Тогда используй On Hit Cast Spell : Unique на оружие.

Еще вариант: на харбите модуля понижать прочность экипировки всем игрокам, находящимся в бою. Не столь реалистично, зато куда менее требовательно к ресурсам, елси игроков много.

Вариант уже был рассмотрен. Мне нужно когда по игроку бьют, а не когда он бьет.
На хартбите не хочу, хотя если припрет, то сделаю.
-fenix-
Посмотри систему Alternative Core, что лежит на сайте (тока он у меня чет не пашет второй день). На скока помню там отслеживается такой момент.
Тебе для шарда или сингла?
Narruin
QUOTE(-fenix- @ Jan 13 2007, 18:42) [snapback]102190[/snapback]

Посмотри систему Alternative Core, что лежит на сайте (тока он у меня чет не пашет второй день). На скока помню там отслеживается такой момент.
Тебе для шарда или сингла?

для pw
Lazy Ranma
Драсте. smile.gif

Инетересно, как в NWN2 с поддержкой баз данных для PW? Так же, как и в nwn, SetCampagin*, или добавили поддержку нормальных баз данных через какие-нибудь плагины?
virusman
QUOTE(Lazy Ranma @ Jan 14 2007, 19:54) [snapback]102270[/snapback]

Драсте. smile.gif

Инетересно, как в NWN2 с поддержкой баз данных для PW? Так же, как и в nwn, SetCampagin*, или добавили поддержку нормальных баз данных через какие-нибудь плагины?
Какие люди...
Всё то же самое, что и с NWN1, только поддержку сохранения объектов в MySQL ещё не успели прикрутить.
Gloom
И сново вопрос...
NSS
AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_MEDITATE,1.0f,60.0f));

почему продолжительность анимации - стандартная, а не 60 секунд?
Lex
возможно не так применяешь функцию, или в другом скрипте у тебя сбивается анимашка (например в хб). Вся LOOPING анимация проигрывается столько, сколько указывается.
зы: попробуй ActionPlayAnimation и если есть опасность чистки очереди, закрой стек команд.
Gloom
ActionPlayAnimation аналогично, в хб врятли... и она не сбивается а именно заканчивается
чтобы быть уверенным на 100% сделал новый модуль, в нем тригер, на он_ентер тригера простой скрипт
NSS
void main()
{
  object oPC =GetEnteringObject();
  AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_MEDITATE,1.0f,60.0f));
}

работает, но длительность стандартная...
Lex
проверил в Авроре - нормально все работает. В Обси проверить не могу сейчас, но если там и правда такой косяк, эт очень странно.
Milfes
Столкнулся с проблемой, надо сделать управляемого хенча. В официальной компании используется функция AddRosterMemberToParty, но у меня не получается присоеденить при помощи нее кого-то. Может кто-то знает как их присоеденять?
azathoth
Сначала нужно добавить непись в ростер, например при помощи AddRosterMemberByTemplate.

Насчет длительности анимации: это корявость обсидиана (см. http://www.city-of-masters.ru/forums/index...?showtopic=4296).
Milfes
Спасибо, все получилось. smile.gif
Milfes
У меня вопрос. Добавляю на onSpawn НПС строку
NSS
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectSleep(),OBJECT_SELF);

Но при проверке, НПС продолжает стоять, как и стоял. Может я что то не правильно делаю? На 1 НВНе этот скрипт вроде работал.
Narruin
QUOTE(Milfes @ Mar 2 2007, 21:01) [snapback]105272[/snapback]

У меня вопрос. Добавляю на onSpawn НПС строку
NSS
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectSleep(),OBJECT_SELF);

Но при проверке, НПС продолжает стоять, как и стоял. Может я что то не правильно делаю? На 1 НВНе этот скрипт вроде работал.

Этот скрипт кидает кондишен сна на кричу, но не заставляет ее лечь на землю.
Milfes
QUOTE
Этот скрипт кидает кондишен сна на кричу, но не заставляет ее лечь на землю.

Ты не прав, он ложится, я выяснил, что он не работает именно на onSpawn. То есть сама функция работает. Странно конечно, что на onSpawn не работает.
-fenix-
Попробуй на onSpawn в скрипте поставить небольшую задержку.
Milfes
Нет не помогает, но складывается такое ощещение, что на оnSpawn не срабатывает именно анимация, что бы он лег, а сам НПС как бы спит, но стоя.
-fenix-
А ты какую задержку ставил? Попробуй поставить две секунды:
NSS
DelayCommand(2.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectSleep(),OBJECT_SELF));

Если сработает, то уменьшай время, чтобы понять какая задержка нужна, ну а если не получицо. Хм... Не судьба ведать пока. smile.gif
Milfes
Я вообще 3 секунды ставил. Да я впринципе на диалоге повесил, меня просто удивляет, что на onSpawn не работает. Наверно обсидан так хорошо сделал.
azathoth
Такая задержка может не сработать:
NSS
DelayCommand(2.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectSleep(),OBJECT_SELF));


Правильно:
NSS
effect eSleep;
DelayCommand(2.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleep, OBJECT_SELF));


NSS
// Delay aActionToDelay by fSeconds.
// * No return value, but if an error occurs, the log file will contain
//  "DelayCommand failed.".
// It is suggested that functions which create effects should not be used
// as parameters to delayed actions.  Instead, the effect should be created in the
// script and then passed into the action.  For example:
// effect eDamage = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL);
// DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
void DelayCommand(float fSeconds, action aActionToDelay)
Lex
а попробовать анимацией положить его не пробовали?
Ragdaj
Даже не уверен, возможно ли такое - но как сделать, чтоб при начале кампании, проверялся класс РС, и взависимости от него, грузилась та, или иная область (ну к примеру - выбрал война - начинаешь в казармах, мага - в лаборатории и т.д.)
Lex
много раз это обсуждалось, скрипт вынесен в Вопросы и Ответу. (там правда было разделение по расе, но суть одна и та же)
Ragdaj
Это разобрался. Спасибо. А вот теперь сложный вопрос - возможно ли как то скриптами прикрутить такую вещь, как использование предметов на объекте.
Не через диалоги!
Перетаскиваешь предмет из инвентаря на НПС\объект и происходит запланированное действие. К примеру порох на костер -> происходит вспышка (пример с потолка).
Диалоговая система не особо устраивает - ибо при обладание нужного предмета его использование становится очевидным - так как появляется необходимая строка в диалоге. Додумываться, как следствие, не надо.
azathoth
Просто перетаскивать не выйдет - предмет просто будет выброшен, но можно добавить к свойствам предмета возможность "юзабельности".

Cast Spell -> Unique Power
Результат прописываешь в скрипте "i_ТэгВещи_ac".
Milfes
QUOTE
а попробовать анимацией положить его не пробовали?


Анимацией тоже не получается, он ее на onSpawn кажется вообще не воспринимает, так как и у эффекта сна не срабатывает только анимация(НПС не на что не реагирует пока эффект не снять, но стоит).
diggers

Nwn2scriptcompiler.exe лежит в корневой папке, но на попытки подсунуть ему .nss не отзывается. Подскажите, как компилировать скрипты без запуска громоздкого тулсета?

Нвн2 скрипты не кеширует, можно править их в оверрайде\модуле сохраненном как папка, перезапускать текущий модуль и смотреть результат.
Вот только делать бы это без тулсета, который ест ресурсов больше чем сам нвн.
Oranj
Есть ли возможность при помощи скриптов сделать включение/выключение источника света в определенные время суток?
Griffon
Есть система ручного включения/выключения источников света.

Цитата
Есть ли возможность при помощи скриптов сделать включение/выключение источника света в определенные время суток?
Может кто из мастеров напишет или выложит уже имеющуюся?
Oranj
Предложенный вариант посмотрел, но ничего не понял, так как очень далек от скриптинга и занимаюсь только маппингом smile.gif Было бы хорошо, если кто-то напишет скрипт и объяснит как его применить.
Sugo77
Привет всем,я новичок в создании и использовании скриптов но в создании модулей уже принимаю участие уже 5 лет начиная с нвн1,а теперь уже и осваиваю нвн2 ,и вот мои первые 2 вопроса,заранее прошу неругать если уже были,
просто я искал на них ответы во многих разделах вашего форума и ненашол(

Как сделать так чтоб монстры респились,ну то есть воскрешались через некоторое время после смерти?
Вот что я испробовал и недобился(
открываю свой модуль скажем Area 1 -далее свойства етой ARea1(Properites) Дальше во всех трех строчках(On_heartbeat On_enter On_dead)повставлял
все найденые поисковиком,етих строчек скрипты с именем respawn их нашлось семь ШТук!(gr_respawn,gui_death_respawn,gui_death_respawn_self,nw_o0_respawn,x0_o0respawn,x0_o0_repawnset,x2_respawn)вот перечислил те что находилис поисковиком,дак я их все на свойствах локации повставлял в строчки:"On_heartbeat On_enter On_dead" и недобился респа,и на свойствах монстров,тоже в строчки:"On_dead,On_heartbeat",вставлял ети семь стандартных скриптов НВН2,но не один из етих семи скриптов невернул неодного монстра к жизни на заданную точку,а ждал я намного больше шести секунд,респа монстров(((
Может не ети скрипты надо выбирать а какой то другой??? или самому прописать?

А второй вопрос: как фракцию сменить?(подхожу к люблму обьекту тыкаю и стаю хостаил как ето сделать?),тоесть чтоб пвп шард создать надо чтоб обязательно кто то один был скажем faction:*comoner*,Другой:*hostile*
Lex
Цитата(Sugo77 @ May 2 2007, 20:27) [snapback]107708[/snapback]
Вот что я испробовал и недобился(
открываю свой модуль скажем Area 1 -далее свойства етой ARea1(Properites) Дальше во всех трех строчках(On_heartbeat On_enter On_dead)повставлял
все найденые поисковиком,етих строчек скрипты с именем respawn их нашлось семь ШТук!(gr_respawn,gui_death_respawn,gui_death_respaw
n_self,nw_o0_respawn,x0_o0respawn,x0_o0_repawnset,
x2_respawn)вот перечислил те что находилис поисковиком,дак я их все на свойствах локации повставлял в строчки:"On_heartbeat On_enter On_dead" и недобился респа,и на свойствах монстров,тоже в строчки:"On_dead,On_heartbeat",вставлял ети семь стандартных скриптов НВН2,но не один из етих семи скриптов невернул неодного монстра к жизни на заданную точку,а ждал я намного больше шести секунд,респа монстров(((
Может не ети скрипты надо выбирать а какой то другой??? или самому прописать?

оригинально. Впервые встречаю такой способ решения поставленной задачи.
Скрипты надо или писать под свои конкретные нужды, или брать готовые и вставлять (возможно модернизируя). Есть специальные уже написанные скриптовые системы для респа монстров. Лучше у шардовиков спросить об этом по подробнее.
Vanes
по поводу спавна мобов была уже тема
см. тут http://www.city-of-masters.ru/forums/index.php?showtopic=287
там вроде и линки какие есть

я, как и раньше, отдаю предпочтение NESS-подобным спавнерам...
собственно такой наверное проще самому написать, чем разбираться с чьим то...
щас к сожалению доступа к модулю нет, как будет - выложу свой вариант...

Цитата
А второй вопрос: как фракцию сменить?(подхожу к люблму обьекту тыкаю и стаю хостаил как ето сделать?),тоесть чтоб пвп шард создать надо чтоб обязательно кто то один был скажем faction:*comoner*,Другой:*hostile*

не обязательно...
кричи из одной фракции замечательно могут бить друг друга smile.gif
честно говоря точно не помню функции, но попробуй SetIsEnemy()... если не подойдет, посмотри в лексиконе все что с этой функцией связано, наверняка какие либо смежные с ней функции тебе помогут...
Sugo77
Vaness,по предложенной тобой ссылке нет ничего конкретного,неодного примера не инструкций(
Единственное что я уяснил для начало надо хотябы заиметь себе програмкуу Ness какуюто,попробовал поискать в интернете ,ссылки на нее битые некачается(

Если у тебя есть рабочие ссылки на ету прогу то вылож плиз или саму прогу скинь плиз на мое мыло если нетрудно

sugo3377@mail.ru

Кстати в теме с просьбами о написании я также изложил ети 2 просьбы чтоб кто то знаюший в етом деле толк, описал подробно алгоритм, и хотябы один рабочий пример,на респ и фракции я ж еше повторяюсь новичок в етом( но огромное желание научится и добится цели.

Вот нашол всеже сайт от куда Несс качается LRJOnline_net - NESS оно не оно?


Тут вроде для нвн 1 несс или он всем подходит?

Далее куда етот файлик NESS_8_1_3Full.erf нужно устаноить чтоб начать им пользоватся в НВН2 тулсете?

Хотелось бы все поподробнее от вас учителей услышать)
Vanes
щас выложу свой скрипт спавна

суть простая...
в локе ставятся вейпоинты с определенным тегом и именем
имя имеет вид
SP_SGx_SDy_SNz1-z2_SRn_END
где x - принимает значение 0 (спавнить конкретного моба) или 1 (спавнить моба из группы)
y - задержка между спавнами
z1 и z2 - соответственно минимальное и максимальное количество мобов
n - на каком максимальном расстоянии от вейпоинта может появиться моб
в теге вейпоинта указывается либо тег моба, либо тег группы для спавна


это на OnEnter локи
* при входе игрока запускается псевдохарбит
Neverwinter Script Source
void main()
{
    object oArea = GetArea(OBJECT_SELF);
    object oPC = GetEnteringObject();
    if(GetIsDM(oPC)) return;
    if(GetIsPC(oPC)){
        int nCount = GetLocalInt(oArea, "nPlayerCount");
        nCount++;
        SetLocalInt(oArea, "nPlayerCount", nCount);
        if(GetLocalInt(oArea, "bNeedSpawn")==FALSE){
            SetLocalInt(oArea, "bNeedSpawn", TRUE);
            if(GetLocalInt(oArea, "bNeedClear")==FALSE){
                ExecuteScript("vr_spawn_general", oArea);
            }else{
                SetLocalInt(oArea, "bNeedClear", FALSE);
            }
        }
    }
}


это на OnExit локи
* при выходе всех игроков с локи замораживает спавнер, если же выходит моб, то не позволяет ему выйти из локи и возвращает на место спавна
Neverwinter Script Source
void main()
{
    object oArea = GetArea(OBJECT_SELF);
    object oPC = GetExitingObject();
    if(GetIsDM(oPC)) return;
    if(GetIsPC(oPC)){
        int nCount = GetLocalInt(oArea, "nPlayerCount");
        nCount--;
        SetLocalInt(oArea, "nPlayerCount", nCount);

        if(nCount<=0){ // no PC in location
            SetLocalInt(oArea, "bNeedSpawn", FALSE);
            object oWP;
            int nSpawnersCount = GetLocalInt(oArea, "nSpawnersCount");
            int i;
            for(i=1; i<=nSpawnersCount; i++){
                oWP = GetLocalObject(oArea, "Spawner"+IntToString(i));
                if(GetLocalInt(oWP, "nChildCount")>0){ // if any spawner has children
                    SetLocalInt(oArea, "nLastPCExitTime", GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime"));
                    SetLocalInt(oArea, "bNeedClear", TRUE);
                    break;
                }
            }
        }
    }else if(GetIsObjectValid(GetLocalObject(oPC, "parent"))){
        //SendMessageToPC(GetFirstPC(), "name="+GetName(oPC));
        object oCreature = CreateObject(OBJECT_TYPE_CREATURE,
                        GetResRef(oPC),
                        GetLocalLocation(oPC, "lHomeLocation"));

        SetLocalLocation(oCreature, "lHomeLocation", GetLocalLocation(oPC, "lHomeLocation"));

        DeleteLocalInt(oPC, "TotalDamage");
        int i;
        for(i=1;i<=GetLocalInt(oPC, "TotalDamagers");i++){
            DeleteLocalObject(oPC, "Damager"+IntToString(i));
            DeleteLocalInt(oPC, "Damage"+IntToString(i));
        }
        DeleteLocalInt(oPC, "TotalDamagers");
        DeleteLocalInt(oPC, "nPreviousHP");
        DeleteLocalObject(oPC, "parent");
        DeleteLocalLocation(oPC, "lHomeLocation");

        DestroyObject(oPC);
    }
}


собственно сам скрипт спавна
*void main() - как раз таки тот самый псевдо харбит, который запускается с частотой, указанной в строках AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
*void CheckWaypoints(object oArea) - проверяет все спавнпоинты в локи и при необходимости их спавнит
*void Spawn(object oWP) - процедура которая непосредственно создает мобов в точках спавна
*void StoreSpawns(object oArea) - срабатывает 1 раз за рестарт... задача его в том, чтобы "расшифровать" тег спавнпоинта и занести все данные в локальные переменные
*void ClearLocationFromCreatures(object oArea) - в случае необходимости деспавна очищает локацию от мобов
Neverwinter Script Source
// SPAWN SYSTEM
// for NWN Shard "Validor 2"
// main script
/* Scripted by Vanes */

#include "vr_spawn_groups"
#include "vr_config"

void CheckWaypoints(object oArea);
void Spawn(object oWP);
void StoreSpawns(object oArea);
void ClearLocationFromCreatures(object oArea);


void main() // psevdo heartbeat
{
    object oArea = OBJECT_SELF;

    if(GetLocalInt(oArea, "bNeedSpawn")==TRUE){
        CheckWaypoints(oArea);
        //SendMessageToPC(GetFirstPC(), "attemting to spawn... "+ GetName(oArea));
        AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        return;
    }
    if(GetLocalInt(oArea, "bNeedClear")==TRUE){
        //SendMessageToPC(GetFirstPC(), "attemting to clear... "+ GetName(oArea));
        //SendMessageToPC(GetFirstPC(), "nLastPCExitTime = " + IntToString(GetLocalInt(oArea, "nLastPCExitTime")));
        //SendMessageToPC(GetFirstPC(), "nCurrentTime = " + IntToString(GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")));
        if((GetLocalInt(oArea, "nLastPCExitTime")+SPAWN_CLEAR_LOC_DELAY)<=GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")){
            //SendMessageToPC(GetFirstPC(), "clearing... "+ GetName(oArea));
            ClearLocationFromCreatures(oArea);
            SetLocalInt(oArea, "bNeedClear", FALSE);
        }else{
            AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        }
        return;
    }
}

void CheckWaypoints(object oArea) // check for WP status (waiting for delay end,
                                  // waiting for children death, need pawn now)
{
    if(GetLocalInt(oArea, "bSpawnsStored")==FALSE){
        StoreSpawns(oArea);
        SetLocalInt(oArea, "bSpawnsStored", TRUE);
    }
    object oWP;
    string sName;
    int nPos, nSpawnDelay, nStartDelay, nCurrentTime;
    int i;
    int nSpawnersCount = GetLocalInt(oArea, "nSpawnersCount");
    //SendMessageToPC(GetFirstPC(), "nSpawnersCount="+IntToString(nSpawnersCount));
    for(i=1; i<=nSpawnersCount; i++){
        oWP = GetLocalObject(oArea, "Spawner"+IntToString(i));
        sName = GetName(oWP);
        //SendMessageToPC(GetFirstPC(), "checking WP " + sName);
        if(GetLocalInt(oWP, "nSpawnDelay")==0){ // first check after module started
            nPos = FindSubString(sName, "SG");
            nSpawnDelay = StringToInt(GetSubString(sName, 5, nPos-6))*60;
            //int nTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //if(nTime!=0){
            //SetLocalInt(oWP, "nStartDelay", 60);
            SetLocalInt(oWP, "nSpawnDelay", nSpawnDelay);
            //}
            Spawn(oWP);
        }
        if(GetLocalInt(oWP, "nChildCount")<=0){
            nStartDelay = GetLocalInt(oWP, "nStartDelay");
            //SendMessageToPC(GetFirstPC(), "nStartDelay=" + IntToString(nStartDelay));
            nCurrentTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //SendMessageToPC(GetFirstPC(), "nCurrentTime=" + IntToString(nCurrentTime));
            nSpawnDelay = GetLocalInt(oWP, "nSpawnDelay");
            //SendMessageToPC(GetFirstPC(), "nSpawnDelay=" + IntToString(nSpawnDelay));
            if(nSpawnDelay<(nCurrentTime-nStartDelay)){
                //SendMessageToPC(GetFirstPC(), "delay end, spawning...");
                SetLocalInt(oWP, "bSpawnDisturbed", FALSE);
                Spawn(oWP);
            }else{
                //SendMessageToPC(GetFirstPC(), "waiting for delay end");
            }
        }
    }
}

void Spawn(object oWP)
{
    object oCreature;
    string sTag;
    int nPos1, nPos2;
    int n, n1, n2, i, r, r1;
    int bGroup = FALSE;
    location lLoc;

    sTag = GetLocalString(oWP, "sTag"); // for Lexey's Spawn Table

//---- SG flag ----
    bGroup = GetLocalInt(oWP, "bGroup");

//---- SRn flag ----
    r = GetLocalInt(oWP, "r");
    location lLocation = GetLocation(oWP);
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition;
    float fOrientation = GetFacingFromLocation(lLocation);

//---- SNn flag ----
    n1 = GetLocalInt(oWP, "nMin");
    n2 = GetLocalInt(oWP, "nMax");
    if(n2!=0){
        n = n1+Random(n2-n1)+1;
    }else{
        n = n1;
    }

    for(i=1; i<=n; i++){
        vPosition = GetPositionFromLocation(lLocation);
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.x += r1;
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.y += r1;

        lLoc = Location(oArea, vPosition, fOrientation);
        if(bGroup==TRUE) sTag = SpawnGroup(oWP);
        oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTag, lLoc);
        if(oCreature!=OBJECT_INVALID){
            SetLocalInt(oWP, "nChildCount", GetLocalInt(oWP, "nChildCount")+1);
            SetLocalObject(oCreature, "parent", oWP);
            SetLocalLocation(oCreature, "lHomeLocation", lLoc);
        }else{
            i--;
        }
    }
}

void StoreSpawns(object oArea)
{
    object oObject = GetFirstObjectInArea(oArea);
    string sName, s;
    string sTag;
    int nPos1, nPos2;
    int nCount=0;
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);
        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)){
            nCount++;
            SetLocalObject(oArea, "Spawner"+IntToString(nCount), oObject);

            SetLocalString(oObject, "sTag", GetTag(oObject));

            //---- SG flag ----
            nPos1 = FindSubString(sName, "SG");
            if((nPos1!=-1)&&(StringToInt(GetSubString(sName, nPos1+2, 1))==1))
                SetLocalInt(oObject, "bGroup", TRUE);

            //---- SRn flag ----
            nPos1 = FindSubString(sName, "SR");
            nPos2 = FindSubString(sName, "END");
            SetLocalInt(oObject, "r", StringToInt(GetSubString(sName, nPos1+2, nPos2-nPos1-3)));

            //---- SNn flag ----
            nPos1 = FindSubString(sName, "SN");
            nPos2 = FindSubString(sName, "SR");
            s = GetSubString(sName, nPos1+2, nPos2-nPos1-3);
            nPos1 = FindSubString(s, "-");
            if(nPos1==-1){
                SetLocalInt(oObject, "nMin", StringToInt(s));
                SetLocalInt(oObject, "nMax", 0);
            }else{
                SetLocalInt(oObject, "nMin", StringToInt(GetSubString(s, 0, nPos1)));
                SetLocalInt(oObject, "nMax", StringToInt(GetSubString(s, nPos1+1, GetStringLength(s)-nPos1-1)));
            }
        }
        oObject = GetNextObjectInArea(oArea);
    }
    SetLocalInt(oArea, "nSpawnersCount", nCount);
}

void ClearLocationFromCreatures(object oArea)
{
    string sName;
    object oWP;
    object oObject = GetFirstObjectInArea(oArea);
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);

        oWP = GetLocalObject(oObject, "parent");
        if(oWP!=OBJECT_INVALID)
            DestroyObject(oObject);

        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)){
            if(GetLocalInt(oObject, "nChildCount")>0){
                SetLocalInt(oObject, "nChildCount", 0);
                if(GetLocalInt(oObject, "bSpawnDisturbed")){
                    SetLocalInt(oObject, "nStartDelay", GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime"));
                }
            }
            //SendMessageToPC(GetFirstPC(), "b="+IntToString(GetLocalInt(oObject, "bSpawnDisturbed")));
        }

        oObject = GetNextObjectInArea(oArea);
    }
}


ну и последнее... скипт, содержащий таблицу групп мобов...
Neverwinter Script Source
string SpawnGroup(object oWP)
{
    string sTag = GetTag(oWP);

    if(sTag=="vr_lowlvlgrp1"){
        switch(d4()){
            case 1: return "vr_badger";
            case 2: return "vr_rat";;
            case 3: return "vr_direrat";
            case 4: return "vr_bat";
        }
    }

    if(sTag=="vr_bugbeargrp"){
        int nCount = GetLocalInt(oWP, "nChildCount");
        if(nCount<1) return "vr_bugbearhero";
        if(nCount<2) return "vr_bugbearshaman";
        switch(d2()){
            case 1: return "vr_bugbear";
            case 2: return "vr_bugbeararcher";
        }
    }

// ---- !!!! ADD GROUPS OVER THIS LINE !!!! ----
    return "";
}
Sugo77
Хех пока никак,новичкам тяжкоsmile.gif

а вот в етой твоей фразе нет ошибки?"в *теге моба* указывается либо тег моба, илбо тег группы для спавна"
Может имелось ввиду в теге поинта?
ну тоесть вот так:"в *теге поинта* указывается либо тег моба, илбо тег группы для спавна"

Да а куда собственно вот етот готовы скрипт вставить мне? в какую строчку?

собственно сам скрипт спавна
*void main() - как раз таки тот самый псевдо харбит, который запускается с частотой, указанной в строках AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
*void CheckWaypoints(object oArea) - проверяет все спавнпоинты в локи и при необходимости их спавнит
*void Spawn(object oWP) - процедура которая непосредственно создает мобов в точках спавна
*void StoreSpawns(object oArea) - срабатывает 1 раз за рестарт... задача его в том, чтобы "расшифровать" тег спавнпоинта и занести все данные в локальные переменные
*void ClearLocationFromCreatures(object oArea) - в случае необходимости деспавна очищает локацию от мобов

Neverwinter Script Source
// SPAWN SYSTEM
// for NWN Shard "Validor 2"
// main script
/* Scripted by Vanes */

#include "vr_spawn_groups"
#include "vr_config"

void CheckWaypoints(object oArea);
void Spawn(object oWP);
void StoreSpawns(object oArea);
void ClearLocationFromCreatures(object oArea);

и тд
Vanes
создаешь скрипт с именем vr_spawn_general (именно он запускается в энтере локи, см. ExecuteScript("vr_spawn_general", oArea)wink3.gif и все туда вставляешь
Sugo77
А еше а как он собственно назватся будет? или просто открываю уже юбой стандартный скрипт нвна и затираю на новый ? а то сам придумал под своим именем шапку Sugo дак несохраняется такое название непринимает его тулсет(
Vanes
так и будет называться - vr_spawn_general...
а в теле скрипта должно быть то, что я выше написал...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.