Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
ReZkiy
Цитата(denis0k @ Sep 11 2011, 11:25) *
x0_i0_walkway - это просто ад и яркий пример того, как делать нельзя smile.gif Там функция запускается из спавна, хертбита и хз чего ещё, а потом ещё рекурсивно вызывает сама себя каждую секунду.

http://www.city-of-masters.ru/forums/index...?showtopic=5123


По теме: хертбит как раз самый простой и изящный вариант, именно для этого он и предназначен, иначе задолбаешься отслеживать все моменты прерывания непися. Чтобы не было тормозов, предусмотрены 2 вещи.

Во-первых, при отсутствии игроков рядом аи выключается. Т.е. скрипты запускаются и сразу выходят на первой строке. Но всякие события всё равно триггерят (те же бесконечные проверки игроков рядом), т.е. выключение аи как бы помогает, но меньше, чем хотелось бы.

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

Если это сингл, но проще запихнуть в хб и не трахать мозги smile.gif Один голый скрипт игру не повесит.


Стоп,стоп! Так че нужно x2_i0_walkways гнать в шею??
И еще - Кто нибудь подскажет мне скрипт хождений - открываний?!?!
greye
Цитата(ReZkiy @ Sep 11 2011, 14:22) *
Стоп,стоп! Так че нужно x2_i0_walkways гнать в шею??

Повторюсь, можно посмотреть, как оно сделано. denis0k напомнил, почему это на самом деле плохо.
Цитата(ReZkiy @ Sep 11 2011, 14:22) *
И еще - Кто нибудь подскажет мне скрипт хождений - открываний?!?!

Тебе подсказали, с помощью чего это всё можно сделать - смотри посты WirTus, denis0k и gennady, а если что-то не будет получаться, то обращайся.
Lex
Цитата(wirTUS @ Sep 9 2011, 17:14) *
.......
Neverwinter Script
  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont1))));
  //Поворачиваем NPC к сундуку

это что за адский ад?
Neverwinter Script
AssignCommand(oNPC, ActionDoCommand(TurnToFaceObject(oNPC),oCont1));

и никакой далее написанной и надуманной проблемы нет.

и далее ActionUnlockObject() явно не в тему. Это отпирать объект. А открывать - немного другая функция. (ActionOpenObject)


Цитата
Если нужно заставить NPC вечно ходить открывать-закрывать сундуки, то первое, что пришло в голову: OnSpawn непися дописывается/ставится скрипт, заставляющий идти к первому сундуку и открыть его. На OnOpen сундука идет проверка, кто открыл, и если это нужный нам непись, то заставляем открывшего закрыть и пойти к другому сундуку, на котором повторяется то же, но учитывая, что сундук другой.

Я сразу вспомнил "Утро Эдвина" (мб помнит кто из старых). Написан он был на примерно схожем принципе, но это все очень криво на самом деле и громоздко. Вариант с ХБ/ЮД, если не писать там фигню - нормальный и стоит думать именно в этом направлении.


ReZkiy, в древней статье я рассматривал вариант оживления НПС, там многие моменты учтены, до которых ты пока не дошел, но скорее всего дойдешь, если продолжишь в этом направлении копать
http://nwnmod.narod.ru/stat_anim_npc2.htm
ReZkiy
Цитата(Lex @ Sep 12 2011, 17:37) *
это что за адский ад?
Neverwinter Script
AssignCommand(oNPC, ActionDoCommand(TurnToFaceObject(oNPC),oCont1));

и никакой далее написанной и надуманной проблемы нет.

и далее ActionUnlockObject() явно не в тему. Это отпирать объект. А открывать - немного другая функция. (ActionOpenObject)



Я сразу вспомнил "Утро Эдвина" (мб помнит кто из старых). Написан он был на примерно схожем принципе, но это все очень криво на самом деле и громоздко. Вариант с ХБ/ЮД, если не писать там фигню - нормальный и стоит думать именно в этом направлении.


ReZkiy, в древней статье я рассматривал вариант оживления НПС, там многие моменты учтены, до которых ты пока не дошел, но скорее всего дойдешь, если продолжишь в этом направлении копать
http://nwnmod.narod.ru/stat_anim_npc2.htm


Спасибо.Посмотри пожалуйста мой вопрос о хаках
wirTUS
Пишу же, я нуб и позорюсь unknw.gif Спасибо за корректировки, пригодится, хех.
О хаках ответ есть, надеюсь, он не настолько крив, как тут smile.gif
Ollone5
Дайте пожалуйста скрипт на спавн, а то я в этом не смог разобраться snoozer_17.gif
virusman
Если просто спаунер, то http://www.lrjonline.net/swg/ness.html
Talarasha
wirTUS, возвращаясь к твоему коду сообщения #3436, а конкретно, по конструкции вида:
Neverwinter Script
while(i<1)
//1 - количество проходов NPC по маршруту
//[позиция NPC] - первый сундук - второй сундук,
{
  ++i;
  //закомментировать строчку выше - плохая идея, ибо при попытке использования бесконечного цикла
  //nwn благополучно зависает
  /* Код */
}

Как мне кажется, это довольно опасное решение. Nwn зависает не при попытке использования бесконечного цикла (на самом деле он их позволяет), а на обработке действий, которые в таком случае игре приходится выполнить. В коде идут действия, помещающиеся в стек персонажей. Стек ограничен, а таким образом ты пытаешься бесконечно, с невероятной скоростью забивать в него все, что у тебя в коде.
Твое решение фиксирует количество проходов, но они по-прежнему выдаются единомоментно. Лимит стека - семьдесят пять, насколько я помню, действий. Цикл примера выдает по пять действия за раз, т.е. если i переходит за 15-16 - тут уже все туманно, сам понимаешь.
Реализуя скрипт на OnEnter триггера, как ты, я бы наверное, забил код в функцию и выполнял ее по делею, или даже попытался бы отследить выполнение текущей итерации (допустим, произвел ли NPC действие над сундуком, который условно принимается за конечную точку, находится ли он в условно конечной позиции и так далее). Теоретически нагрузка на игру тогда действительно будет меньше, чем с помощью HB, но вряд ли даст ощутимый результат.
Ollone5
Цитата
Если просто спаунер, то http://www.lrjonline.net/swg/ness.html

А что это? надо закачивать?
ReZkiy
Люди! Дайте скрипт вот для OnClientInter:
Дает предмет по классу или расе:
Полурослику - штаны с кинжалом;
Эльфу - лук и стрелы с каким нибудь эльфийским доспехом и т.п;
Или так: воину меч, друиду посох и т.п
Кто нибудь знает такое?
ReZkiy
Цитата(wirTUS @ Sep 18 2011, 01:06) *

Здесь такого нет. Или есть но не то.
wirTUS
Цитата
Здесь такого нет. Или есть но не то.


Цитата
Люди! Дайте скрипт вот для OnClientInter:
Дает предмет по классу или расе

Цитата
Начем. Самое главное, это начало модуля. Тут все написано, как раздеть игрока, одеть, дать ему денег и отправить дальше. Ставится он на слот модуля OnClientEnter.
ReZkiy
wirTUS, так как в 2да урук-хаев,лошадей и разные дополнения к одежде добавить?
Ollone5
Цитата
дополнения к одежде добавить? так как в 2да урук-хаев,лошадей и разные

Проще скачать хак.
ReZkiy
Цитата
Проще скачать хак.

Ага. Знаешь как все виснет? И где мне его найти? Один есть - не работает.
wirTUS
Цитата
wirTUS, так как в 2да урук-хаев,лошадей и разные дополнения к одежде добавить?

Легко.
Заполняешь appearance.2da строчками, состоящими из "****" на каждый столбец вплоть до 750 строки. Далее:
Урук-хаев: дописываешь туда же "751 Uruk-Hai", далее звездочками
Лошадей: так же, но вместо Uruk-Hai пишешь Horse и вместо 751, предположим, 752

Дополнения к одежде: берешь parts_[название нужной части].2da, смотришь на этот 2да Safe2DALines.txt, прописываешь все звездочками до строки, значащейся в оном текстовике, далее аналогично урук-хаям и лошадям: дописываешь [id] part100500, далее звездочками.

А еще через 2da можно корованы грабить: создаешь 2да под названием rob_cowtrain.2da, прописываешь в него такие столбцы:
Id - так же, как и везде
Name1 - ресреф возницы корована
Name2 - ресреф первого охранника
Name3 - ресреф второго охранника
RoberT - тип грабителя - E - ельф, Z - злодей
RName1 - ресреф главного грабителя
RName2 - ресреф первого неглавного грабителя
RName3 - ресреф второго неглавного грабителя
CApp1 - Id из appearence.2da, отвечающий за внешний вид первого существа, тянущего корован
CApp2 - Id из appearence.2da, отвечающий за внешний вид второго существа, тянущего корован
CApp3 - Id из appearence.2da, отвечающий за внешний вид третьего существа, тянущего корован
CApp4 - Id из appearence.2da, отвечающий за внешний вид четвертого существа, тянущего корован

Затем запихиваешь этот 2да в хак. В палитре появится триггер COWTRAINROB, ставишь его куда тебе надо и наслаждаешься ограблением корована, написанного тобой в 2да.

Цитата
И где мне его найти?
ваулт. А лошадей можно поставить биоваревских, поставив патч 1.69
ReZkiy
Цитата
вместо 751, предположим, 751

scratch_one-s_head.gif Это как понять?
wirTUS
*исправил*
Ollone5
ReZkiy, а другие вещи и расы мира LOTR тебя интересуют?
(оружие, броня, ортханк)




Ollone5
Я нашёл эти скрипты yu.gif , пожалуйста скажите для чего они нужны? Куда ставятся dance.gif ? И напишите комментарии к ним. king.gif
пожалуйста pilot.gif
Neverwinter Script
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT9
/*
* Default OnSpawn handler with XP1 revisions.
* This corresponds to and produces the same results
* as the default OnSpawn handler in the OC.
*
* This can be used to customize creature behavior in three main ways:
*
* - Uncomment the existing lines of code to activate certain
*  common desired behaviors from the moment when the creature
*  spawns in.
*
* - Uncomment the user-defined event signals to cause the
*  creature to fire events that you can then handle with
*  a custom OnUserDefined event handler script.
*
* - Add new code _at the end_ to alter the initial
*  behavior in a more customized way.
*/

//:://////////////////////////////////////////////////
//:: Copyright © 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/11/2002
//:://////////////////////////////////////////////////

#include "x0_i0_anims"
// #include "x0_i0_walkway" - in x0_i0_anims
#include "x0_i0_treasure"

void main()
{
    // ***** Spawn-In Conditions ***** //

    // * REMOVE COMMENTS (// ) before the "Set..." functions to activate
    // * them. Do NOT touch lines commented out with // *, those are
    // * real comments for information.

    // * This causes the creature to say a one-line greeting in their
    // * conversation file upon perceiving the player. Put [NW_D2_GenCheck]
    // * in the "Text Seen When" field of the greeting in the conversation
    // * file. Don't attach any player responses.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);

    // * Same as above, but for hostile creatures to make them say
    // * a line before attacking.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERS
ATION);


    // * This NPC will attack when its allies call for help
    // *
    // SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET
);


    // * If the NPC has the Hide skill they will go into stealth mode
    // * while doing WalkWayPoints().
    // *
    // SetSpawnInCondition(NW_FLAG_STEALTH);

    // * Same, but for Search mode
    // *
    // SetSpawnInCondition(NW_FLAG_SEARCH);

    // * This will set the NPC to give a warning to non-enemies
    // * before attacking.
    // * NN -- no clue what this really does yet
    // *
    // SetSpawnInCondition(NW_FLAG_SET_WARNINGS);

    // * Separate the NPC's waypoints into day & night.
    // * See comment on WalkWayPoints() for use.
    // *
    // SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);

    // * If this is set, the NPC will appear using the "EffectAppear"
    // * animation instead of fading in, *IF* SetListeningPatterns()
    // * is called below.
    // *
    // SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMAT
ION);


    // * This will cause an NPC to use common animations it possesses,
    // * and use social ones to any other nearby friendly NPCs.
    // *
    // SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMA
TIONS);


    // * Same as above, except NPC will wander randomly around the
    // * area.
    // *
    // SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);

    // **** Animation Conditions **** //
    // * These are extra conditions you can put on creatures with ambient
    // * animations.

    // * Civilized creatures interact with placeables in
    // * their area that have the tag "NW_INTERACTIVE"
    // * and "talk" to each other.
    // *
    // * Humanoid races are civilized by default, so only
    // * set this flag for monster races that you want to
    // * behave the same way.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);

    // * If this flag is set, this creature will constantly
    // * be acting. Otherwise, creatures will only start
    // * performing their ambient animations when they
    // * first perceive a player, and they will stop when
    // * the player moves away.
    // SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);

    // * Civilized creatures with this flag set will
    // * randomly use a few voicechats. It's a good
    // * idea to avoid putting this on multiple
    // * creatures using the same voiceset.
    // SetAnimationCondition(NW_ANIM_FLAG_CHATTER);

    // * Creatures with _immobile_ ambient animations
    // * can have this flag set to make them mobile in a
    // * close range. They will never leave their immediate
    // * area, but will move around in it, frequently
    // * returning to their starting point.
    // *
    // * Note that creatures spawned inside interior areas
    // * that contain a waypoint with one of the tags
    // * "NW_HOME", "NW_TAVERN", "NW_SHOP" will automatically
    // * have this condition set.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE
_RANGE);



    // **** Special Combat Tactics *****//
    // * These are special flags that can be set on creatures to
    // * make them follow certain specialized combat tactics.
    // * NOTE: ONLY ONE OF THESE SHOULD BE SET ON A SINGLE CREATURE.

    // * Ranged attacker
    // * Will attempt to stay at ranged distance from their
    // * target.
    // SetCombatCondition(X0_COMBAT_FLAG_RANGED);

    // * Defensive attacker
    // * Will use defensive combat feats and parry
    // SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);

    // * Ambusher
    // * Will go stealthy/invisible and attack, then
    // * run away and try to go stealthy again before
    // * attacking anew.
    // SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);

    // * Cowardly
    // * Cowardly creatures will attempt to flee
    // * attackers.
    // SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);


    // **** Escape Commands ***** //
    // * NOTE: ONLY ONE OF THE FOLLOWING SHOULD EVER BE SET AT ONE TIME.
    // * NOTE2: Not clear that these actually work. -- NN

    // * Flee to a way point and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);

    // * Flee to a way point and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);

    // * Teleport to safety and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);

    // * Teleport to safety and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);



    // ***** CUSTOM USER DEFINED EVENTS ***** /


    /*
      If you uncomment any of these conditions, the creature will fire
      a specific user-defined event number on each event. That will then
      allow you to write custom code in the "OnUserDefinedEvent" handler
      script to go on top of the default NPC behaviors for that event.

      Example: I want to add some custom behavior to my NPC when they
      are damaged. I uncomment the "NW_FLAG_DAMAGED_EVENT", then create
      a new user-defined script that has something like this in it:

      if (GetUserDefinedEventNumber() == 1006) {
          // Custom code for my NPC to execute when it's damaged
      }

      These user-defined events are in the range 1001-1007.
    */


    // * Fire User Defined Event 1001 in the OnHeartbeat
    // *
    // SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);

    // * Fire User Defined Event 1002
    // *
    // SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);

    // * Fire User Defined Event 1005
    // *
    // SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);

    // * Fire User Defined Event 1006
    // *
    // SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);

    // * Fire User Defined Event 1008
    // *
    // SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);

    // * Fire User Defined Event 1003
    // *
    // SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT
);


    // * Fire User Defined Event 1004
    // *
    // SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);



    // ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //

    // * Goes through and sets up which shouts the NPC will listen to.
    // *
    SetListeningPatterns();

    // * Walk among a set of waypoints.
    // * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
    // *    among them in order.
    // * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
    // *    and return to it after combat.
    //
    // * Optional Parameters:
    // * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
    //
    // * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
    // * create waypoints with the tags "WN_" + NPC Tag + "_##"
    // * and those will be walked at night. (The standard waypoints
    // * will be walked during the day.)
    // * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
    WalkWayPoints();


    //* Create a small amount of treasure on the creature
    CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);


    // ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
    ExecuteScript("zombie_feed", OBJECT_SELF);
}


Neverwinter Script
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT9
/*
* Default OnSpawn handler with XP1 revisions.
* This corresponds to and produces the same results
* as the default OnSpawn handler in the OC.
*
* This can be used to customize creature behavior in three main ways:
*
* - Uncomment the existing lines of code to activate certain
*  common desired behaviors from the moment when the creature
*  spawns in.
*
* - Uncomment the user-defined event signals to cause the
*  creature to fire events that you can then handle with
*  a custom OnUserDefined event handler script.
*
* - Add new code _at the end_ to alter the initial
*  behavior in a more customized way.
*/

//:://////////////////////////////////////////////////
//:: Copyright © 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/11/2002
//:://////////////////////////////////////////////////

#include "x0_i0_anims"
// #include "x0_i0_walkway" - in x0_i0_anims
#include "x0_i0_treasure"

void main()
{
    // ***** Spawn-In Conditions ***** //

    // * REMOVE COMMENTS (// ) before the "Set..." functions to activate
    // * them. Do NOT touch lines commented out with // *, those are
    // * real comments for information.

    // * This causes the creature to say a one-line greeting in their
    // * conversation file upon perceiving the player. Put [NW_D2_GenCheck]
    // * in the "Text Seen When" field of the greeting in the conversation
    // * file. Don't attach any player responses.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);

    // * Same as above, but for hostile creatures to make them say
    // * a line before attacking.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERS
ATION);


    // * This NPC will attack when its allies call for help
    // *
    // SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET
);


    // * If the NPC has the Hide skill they will go into stealth mode
    // * while doing WalkWayPoints().
    // *
    // SetSpawnInCondition(NW_FLAG_STEALTH);

    // * Same, but for Search mode
    // *
    // SetSpawnInCondition(NW_FLAG_SEARCH);

    // * This will set the NPC to give a warning to non-enemies
    // * before attacking.
    // * NN -- no clue what this really does yet
    // *
    // SetSpawnInCondition(NW_FLAG_SET_WARNINGS);

    // * Separate the NPC's waypoints into day & night.
    // * See comment on WalkWayPoints() for use.
    // *
    // SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);

    // * If this is set, the NPC will appear using the "EffectAppear"
    // * animation instead of fading in, *IF* SetListeningPatterns()
    // * is called below.
    // *
    // SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMAT
ION);


    // * This will cause an NPC to use common animations it possesses,
    // * and use social ones to any other nearby friendly NPCs.
    // *
    // SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMA
TIONS);


    // * Same as above, except NPC will wander randomly around the
    // * area.
    // *
    // SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);

    // **** Animation Conditions **** //
    // * These are extra conditions you can put on creatures with ambient
    // * animations.

    // * Civilized creatures interact with placeables in
    // * their area that have the tag "NW_INTERACTIVE"
    // * and "talk" to each other.
    // *
    // * Humanoid races are civilized by default, so only
    // * set this flag for monster races that you want to
    // * behave the same way.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);

    // * If this flag is set, this creature will constantly
    // * be acting. Otherwise, creatures will only start
    // * performing their ambient animations when they
    // * first perceive a player, and they will stop when
    // * the player moves away.
    // SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);

    // * Civilized creatures with this flag set will
    // * randomly use a few voicechats. It's a good
    // * idea to avoid putting this on multiple
    // * creatures using the same voiceset.
    // SetAnimationCondition(NW_ANIM_FLAG_CHATTER);

    // * Creatures with _immobile_ ambient animations
    // * can have this flag set to make them mobile in a
    // * close range. They will never leave their immediate
    // * area, but will move around in it, frequently
    // * returning to their starting point.
    // *
    // * Note that creatures spawned inside interior areas
    // * that contain a waypoint with one of the tags
    // * "NW_HOME", "NW_TAVERN", "NW_SHOP" will automatically
    // * have this condition set.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE
_RANGE);



    // **** Special Combat Tactics *****//
    // * These are special flags that can be set on creatures to
    // * make them follow certain specialized combat tactics.
    // * NOTE: ONLY ONE OF THESE SHOULD BE SET ON A SINGLE CREATURE.

    // * Ranged attacker
    // * Will attempt to stay at ranged distance from their
    // * target.
    // SetCombatCondition(X0_COMBAT_FLAG_RANGED);

    // * Defensive attacker
    // * Will use defensive combat feats and parry
    // SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);

    // * Ambusher
    // * Will go stealthy/invisible and attack, then
    // * run away and try to go stealthy again before
    // * attacking anew.
    // SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);

    // * Cowardly
    // * Cowardly creatures will attempt to flee
    // * attackers.
    // SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);


    // **** Escape Commands ***** //
    // * NOTE: ONLY ONE OF THE FOLLOWING SHOULD EVER BE SET AT ONE TIME.
    // * NOTE2: Not clear that these actually work. -- NN

    // * Flee to a way point and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);

    // * Flee to a way point and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);

    // * Teleport to safety and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);

    // * Teleport to safety and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);



    // ***** CUSTOM USER DEFINED EVENTS ***** /


    /*
      If you uncomment any of these conditions, the creature will fire
      a specific user-defined event number on each event. That will then
      allow you to write custom code in the "OnUserDefinedEvent" handler
      script to go on top of the default NPC behaviors for that event.

      Example: I want to add some custom behavior to my NPC when they
      are damaged. I uncomment the "NW_FLAG_DAMAGED_EVENT", then create
      a new user-defined script that has something like this in it:

      if (GetUserDefinedEventNumber() == 1006) {
          // Custom code for my NPC to execute when it's damaged
      }

      These user-defined events are in the range 1001-1007.
    */


    // * Fire User Defined Event 1001 in the OnHeartbeat
    // *
    // SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);

    // * Fire User Defined Event 1002
    // *
    // SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);

    // * Fire User Defined Event 1005
    // *
    // SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);

    // * Fire User Defined Event 1006
    // *
    // SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);

    // * Fire User Defined Event 1008
    // *
    // SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);

    // * Fire User Defined Event 1003
    // *
    // SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT
);


    // * Fire User Defined Event 1004
    // *
    // SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);



    // ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //

    // * Goes through and sets up which shouts the NPC will listen to.
    // *
    SetListeningPatterns();

    // * Walk among a set of waypoints.
    // * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
    // *    among them in order.
    // * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
    // *    and return to it after combat.
    //
    // * Optional Parameters:
    // * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
    //
    // * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
    // * create waypoints with the tags "WN_" + NPC Tag + "_##"
    // * and those will be walked at night. (The standard waypoints
    // * will be walked during the day.)
    // * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
    WalkWayPoints();


    //* Create a small amount of treasure on the creature
    CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);


    // ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
    ExecuteScript("zombie_feed", OBJECT_SELF);
}

Neverwinter Script
//::///////////////////////////////////////////////////
//:: ZombieOnDeath - Modified X0_C2_DTH_LOOTDC
//:: OnDeath handler.
//:: Leave a lootable corpse that will decay after a
//:: short delay.  Modified for zombie feed script.
//::
//:: Copyright © 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Modified by: Lupin-III (lupin_3rd@hotmail.com)
//::///////////////////////////////////////////////////

#include "nw_i0_generic"
#include "x0_i0_corpses"

void main()
{
    SetLocalInt(OBJECT_SELF, "deceased", 1);
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }

    // Leave a lootable corpse that will decay after a brief wait
    KillAndReplaceLootable(OBJECT_SELF, TRUE, TRUE);
}


Neverwinter Script
//::///////////////////////////////////////////////
//:: Zombies feed! 1.2    zombie_feed.nss
//:: by Lupin III
//:: lupin_3rd@hotmail.com
//:://////////////////////////////////////////////
/*
  Zombies will move over to the nearest corpse and start
  diggin' in.  This version requires Shadows of Undrentide.

  To use place the following line in the OnSpawn script
  of a creature before the final }

      ExecuteScript("zombie_feed", OBJECT_SELF);

*/

//:://////////////////////////////////////////////
#include "x0_i0_corpses"

void main ()
{
int nRandom = d20(1);
object oZombieFood = GetNearestCorpse();
location llocation = GetLocation(GetNearestCorpse());
effect eRegen = EffectRegenerate(1, 4.0);
effect eZombieFeed = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);

if (oZombieFood == OBJECT_INVALID)
  {
      switch (d6())
      {
    case 1:
      ActionWait(5.0);
      if (nRandom<=14){PlaySound("c_zombtyr_bat1");}
      break;
    case 2:
      if (nRandom<=14){PlaySound("c_zombwar_bat1");}
      SpeakString("..the.. hunger...");      //comment this line if you don't want random zombie one liners
      ActionWait(6.0);
      break;
    case 3:
      ActionWait(4.0);
      if (nRandom<=14){PlaySound("c_zombie_atk1");}
      SpeakString("...need flesh");          //comment this line if you don't want random zombie one liners
      ActionWait(2.0);
      break;
    case 4:
      if (nRandom<=14){PlaySound("c_zombie_atk2");}
      ActionWait(10.0);
      break;
    case 5:
      ActionWait(8.0);
      if (nRandom<=14){PlaySound("c_zombie_atk3");}
      break;
    case 6:
      ActionWait(1.0);
      if (nRandom<=14){PlaySound("c_zombie_slct");}
      ActionWait(2.0);
      SpeakString("unghh..");            //comment this line if you don't want random zombie one liners
      break;
      }
    ActionRandomWalk();
    DelayCommand(19.5, ClearAllActions());
    if (nRandom<=10){DelayCommand(20.0, ExecuteScript("zombie_feed", OBJECT_SELF));}
    if (nRandom>=11){DelayCommand(25.0, ExecuteScript("zombie_feed", OBJECT_SELF));}
  }
else
if(GetIsDead(OBJECT_SELF) == FALSE)
  {
  ActionForceMoveToObject(oZombieFood, FALSE, 1.0f, 30.0f);
  SetFacingPoint(GetPosition(oZombieFood));
  if (nRandom==2) {DelayCommand(15.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eZombieFeed, oZombieFood, 1.0));}  //comment this line if you don't like the visual effects
  if (nRandom==6) {DelayCommand(10.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eZombieFeed, oZombieFood, 1.0));}  //comment this line if you don't like the visual effects
  if (nRandom<=13){ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0,19.0f);}
  if (nRandom<=13){ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRegen, OBJECT_SELF, 16.0);}
  if (nRandom>=18){ActionRandomWalk();}
  switch (d6())
      {
    case 1:
      ActionWait(5.0);
      if (nRandom<=14){PlaySound("c_zombtyr_bat1");}
      break;
    case 2:
      if (nRandom<=14){PlaySound("c_zombwar_bat1");}
      SpeakString("..braaiinss..");      //comment this line if you don't want random zombie one liners
      ActionWait(6.0);
      break;
    case 3:
      ActionWait(4.0);
      if (nRandom<=14){PlaySound("c_zombie_atk1");}
      SpeakString("..fleesshh");          //comment this line if you don't want random zombie one liners
      ActionWait(2.0);
      break;
    case 4:
      if (nRandom<=14){PlaySound("c_zombie_atk2");}
      ActionWait(10.0);
      break;
    case 5:
      ActionWait(8.0);
      if (nRandom<=14){PlaySound("c_zombie_atk3");}
      break;
    case 6:
      ActionWait(1.0);
      if (nRandom<=14){PlaySound("c_zombie_slct");}
      ActionWait(2.0);
      SpeakString("mnauhh...");            //comment this line if you don't want random zombie one liners
      break;
    }
  DelayCommand(19.5, ClearAllActions());
  if (nRandom<=10){DelayCommand(20.0, ExecuteScript("zombie_feed", OBJECT_SELF));}
  if (nRandom>=11){DelayCommand(25.0, ExecuteScript("zombie_feed", OBJECT_SELF));}
  }
}


hunter.gif


Talarasha
Первые два скрипта - стандартный OnSpawn-скрипт, включенный в режиме поиска точек патрулирования и генерации сокровищ, к которому приписали вызов зомби-скрипта. Третий - стандартный OnDeath скрипт, к которому приписали ограбляемый труп. Последний скрипт, как следует из описания, заставляет монстра искать ближайшие трупы и рыться в них ("есть"), издавая звуки и отправляя в чат мессаги. Его никуда не надо ставить, вызывается через OnSpawn-скрипт. Подробные комментарии имеются в коде.
ReZkiy
Цитата(Ollone5 @ Sep 20 2011, 00:22) *
ReZkiy, а другие вещи и расы мира LOTR тебя интересуют?
(оружие, броня, ортханк)





Где???
Ollone5
Сюда declare.gif
ReZkiy
http://vnmedia.ign.com/nwvault.ign.com/fms...81188_thumb.jpg
Где ты нашел орка который на ближнем плане? В каком хаке?
Ollone5


Здесь declare.gif !
ReZkiy
76 мегабайт swoon.gif
Но все равно спасибо!
Ollone5
Цитата
76 мегабайт swoon.gif
Но все равно спасибо!

Ты конкретно скажи, victory.gif что тебя интересует. Я многое нашёл и ещё найду! wizard.gif
Flaristan
Недавно пришлось придумать и использовать описанную ниже конструкцию из цикла с вложенным в него циклом (знаю что это может быть нехорошо, но для решения поставленной задачи другого оптимального варианта не нашел):..
Neverwinter Script
object oArea = OBJECT_SELF;
object oTarget;
int iInt;
string sInt;

iInt = 1;
sInt = IntToString(iInt);
while (GetIsObjectValid(GetWaypointByTag("WP_tag_"+sInt)))
      {
//(тело вложенного цикла)//////
      oTarget = GetFirstObjectInArea(oArea);
      while (GetIsObjectValid(oTarget))
            {
            if (oTarget == GetWaypointByTag("WP_tag_"+sInt))
               {
//-----------------------------
//(блок для тела условия)
//-----------------------------
               }
            oTarget = GetNextObjectInArea(oArea);
            }
///////////////////////////////
      iInt++;
      sInt = IntToString(iInt);
      }

…цикл рассчитан на универсальность использования при работе с последовательностью вейпоинтов переменной длины с заданным шаблоном тагов (WP_tag_1, WP_tag_2, WP_tag_3, WP_tag_iInt…); внутренний цикл отыскивает по тагу среди множества всех объектов на локации текущий (из внешнего цикла) вейпоинт с i-тым тагом и выполняет условие скрипта при нахождении.
Собсно вопрос: конструкция работоспособная, но в лог вызывает сообщение об ошибке (стандартное «СЛИЖКОМ МНОГО ИНСТРУКЦИЙ») – что может вызывать ошибку и в чем она?


Похоже сам себя перемудрил – внутренний цикл лишний и видимо он и вызывает ошибку. crazy.gif
Ilerien
Навскидку ошибки не нашёл (количество операций пропорционально количеству вейпоинтов помножить на количество объектов в локе - вероятно, это слишком дофига), но это извращение.
Neverwinter Script
int i = 2;
object oWP = GetWaypointByTag("WP_tag_1");
while (GetIsObjectValid(oWP))
{
      if(GetArea(oWP) == OBJECT_SELF)
      {
//какой-то код
      }

      oWP = GetWaypointByTag("WP_tag_" + IntToString(i));
      i++;
}
Почему бы не так?..
Flaristan
Да, я так и исправил в посте – внутренний цикл можно просто удалить, а если префикс «tag» менять на уникальный для групп вейпоинтов/локация, то и условие «if(GetArea(oWP) == OBJECT_SELF)» там тоже ненужно. Просто долго извращался над скриптом, чтоб научить работать с переменным числом вейпоинтов и потом упрощал его до минимума слегка коряво. smile.gif
Anakondar
Чуть призадумался. Подскажите навскидку:

1. Поставил в OnDeath существ проверку:
Код
if (GetIsPC(oKiller)) GiveXPToCreature(oKiller, nXP);
else if (GetIsPC(GetMaster(oKiller)) GiveXPToCreature(GetMaster(oKiller), nXP);

в надежде, что стоящий в безопасной области визард будет качаться, когда на другом конце света фамильяр, которым управляет игрок, мочит монстру. Хрен-то там. Если убивает в той же области,где и отдыхает персонаж - опыт даётся, в другой - нет. Вай?

2. Хотел сделать такую фичу: друид преврящается в жЫвотное, и все окружающие звери начинают дружить его (и его энимал компаньона), друид преврящается в голема (шейпшифтом), и все окружающие големы начинают дружить его (и его энимал компаньона; последнее, конечно не натурально, можно пытаться исправить, но пока не мешает). Трабл в следующем: друид в звероформе и будучи дружественным к фракции энимал пробегает мимо гоблина (естественно врага). Гоблин его естественно тюкает по шкуре своими никчёмными гоблинскими лапами. Но друиду действия гоблина глубоко паралельны, ибо он реально бежит по делам. А вот дикому и ужасному зверю-еното-бобру из фракции энимал совсем не пофиг. Он подбегает к гоблину и говорит: "Ты на кого клешни поднял? На моего друга! Сейчас я тебе клешни твои пообломаю!". "Да ладно, не парься, друг, я не в обиде на него," - говорит друид. "Слушай да, беги куда бежал! Тут уже личное. Я ему точно вмажу!", - говорит боброенот. И вмазал. Гоблин в ответ, и ещё и братков своих позвал. Ну енот тоже не лох, своих друганов позвал. Лосе-черепаху там, чёткого мишку и других. В общем, разборка началась чисто конкретная, клык за клык, все энималы против всех гоблиноидов во всех локациях воюют. Шерсть, пух, чешуя только и летят. Комбат саунд даже в соседних модулях слышен, не то что в соседних локациях. Как с этим беспределом бороться, можно ли навалять одному этому козлу носатому, чтобы со всей бандой отношения не портить?
Ilerien
1. Навскидку не скажу, посмотри, что вернёт GetMaster(oKiller), когда маг и фам в разных локах.
2. Проблема во флажке Global, нужно его убрать в редакторе фракций, видимо, и для животных, и для гоблиноидов.
denis0k
2. Компьютер мой помер, пишу по памяти. Во-первых, помогают только френды, нейтралы (50 реп) в бой не лезут. Во-вторых, смотри скрипты аи, там может быть сдвиг репутации фракции. И, в-третьих, кури мануал, он тоже должен помочь. Про глобал-флаг уже сказали.
Anakondar
Цитата(Ilerien @ Oct 28 2011, 06:52) *
1. Навскидку не скажу, посмотри, что вернёт GetMaster(oKiller), когда маг и фам в разных локах.

Уже дня три назад добавил индикаторы этих чеков, но нвн запустить пока не удаётся ибо работа.

Цитата(Ilerien @ Oct 28 2011, 06:52) *
Проблема во флажке Global

Даже без него фракции друг друга звереют, в лайн оф сайт как минимум. Но я, пожалуй, готов предъявить жесткие требования к системе: НПС не воюют друг с другом никогда. Если нужно противное - использовать анимацию ударов и эффекты урона.
denis0k
Цитата
Но я, пожалуй, готов предъявить жесткие требования к системе: НПС не воюют друг с другом никогда.
Просто более внимательно изучи вопрос smile.gif Неписи - всего лишь компьютерные болванчики, работающие на скриптах, их можно настроить как угодно.
Цитата
Если нужно противное - использовать анимацию ударов и эффекты урона.
Нвн1, насколько мне известно, не даёт особо порулить анимацией. Это фишка нвн2.
Anakondar
Цитата(Ilerien @ Oct 28 2011, 06:52) *
1. Навскидку не скажу, посмотри, что вернёт GetMaster(oKiller), когда маг и фам в разных локах.


GetMaster(oKiller) возвращает персонажа, зато GetIsPC(GetMaster(oKiller)) возвращает FALSE. Всё работает в таком виде:
Код
        if (GetIsPC(oKiller))
        {
            if (GetIsPossessedFamiliar(oKiller)) oKiller = GetMaster(oKiller);
            GiveXPToKiller (oKiller, fXP);
        }
        return;


P.S.: GiveXPToKiller - моя внутренняя функция
Flaristan
Работая с функцией ExecuteScript, столкнулся с парой таких интересных фактов:
- Лексикон категорически настаивает, что у этой функции нет задержки («ExecuteScript() has NO delay!» (с));
- компилятор тулсета же вполне нормально воспринял при пробе такую конструкцию, и на первый взгляд она даже правильно работала при тесте …но неожиданно стали возникать странные перебои в отсчете модульного времени.
Стало создаваться впечатление, что часы модуля отказывались идти вперед в тех локациях, где работала эта скриптовая конструкция. А когда персонаж их покидал – время делало резкий скачек к тому значению, которое оно должно было достигнуть естественным путем, нибудь тех сбоев.

Скрипт крепится на объекте, срабатывает при взаимодействии с PC и по задумке перезапускает сам себя через таймаут до тех пор пока на локации есть PC.
Код
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1, -1, -1, -1, -1);
object oArea = GetArea(OBJECT_SELF);

if ((GetIsObjectValid(oPC))&&(GetArea(oPC) == oArea))
   {
   DelayCommand(100.0, ExecuteScript("script", OBJECT_SELF));
   }


Часто видел похожие проблемы со скачками времени в других онлайн-модулях. Кто знает – эти вещи действительно взаимосвязаны и лучше не делать таймаутов для ExecuteScript?
Ilerien
Цитата
- Лексикон категорически настаивает, что у этой функции нет задержки («ExecuteScript() has NO delay!» (с));
Лексикон прав. ExecuteScript() вызывается без задержки (если не скормить ему эту задержку специально), а вызвавший его скрипт ждёт, пока тот не завершится.

Если это весь код, который перезапускается, то никаких лагов со свременем он вызывать не должен.
denis0k
Лаги со временем - фича движка нвн, появляется в зависимости от положения звёзд на небе. Особенно, если игроков немало зашло. На геме в 2005м время тормозило даже в локациях без скриптов.

Вирусман вроде фикс делал (да, нвнх). Вариант попроще - на модульный хб раз в минуту (или игровой час, не помню как там нвн показывает) вручную время ставить.
Valeroy
Как сделать, чтобы мобы возрождались после смерти спустя некоторое время?
denis0k
Например, использовать систему энкаунтер-триггеров из тулсета, там вроде есть опция периодического спавна. Но в онлайне чаще используются аналогичные скриптовые системы, как правило самописные, они более гибкие (можно динамически менять списки мобов, подгружать их из базы и т.п.). Посмотри на волте что-то типа spawn system, этого добра там должно быть навалом.
Valeroy
Цитата(denis0k @ Feb 5 2012, 10:11) *
Например, использовать систему энкаунтер-триггеров из тулсета, там вроде есть опция периодического спавна. Но в онлайне чаще используются аналогичные скриптовые системы, как правило самописные, они более гибкие (можно динамически менять списки мобов, подгружать их из базы и т.п.). Посмотри на волте что-то типа spawn system, этого добра там должно быть навалом.

А есть готовый скрипт на spawn монстров, но в котором можно будет менять монстров, и время spawna, спавн убудет делаться для онлайна, сам со скриптами не умею работать, по возможности если есть скрипт допишите с нормальный разяснением, чтобы человек не пользовавшийся скриптами понял
Автор:::::::::::::::::Milez:::::::::::::::::::::::
:::::::
denis0k
На волте и есть готовые скрипты. Но без знания скриптового языка всё равно ничего не сделать. Нельзя же читать, не зная букв, или решать дифференциальные уравнения, не зная математики.
Melisse
Чем, кстати, не устраивают обычные встречи? там можно настраивать мобов и их кол-во, даже генерацию от того какой фракцией наступаешь.
Valeroy
В смысле встречи?
Если ставить триггеры, то респ я так понимаю будет происходить, если на него снова наступить, получается надо будет всех информировать, что при входе снова в локацию, будет респ мобов, и ставить триггер как раз на входе, или может я что то не понимаю?
Потом допустим если мне нужно поставить моба где нибудь на возвышении гор одного, как я это сделаю с триггером, он респаться будет на каком растоянии..
У меня просьба, если кто делал скрипты на спавн мобов с пропись разных мобов, чтобы их можно было поменять на других, ну тоесть на любых других какие будут в модуле, и время через каторое будет респ, я в скриптах почти 0, а разбиратся в них просто времени нет работаю много, если кто напишет, потом обязательно договоримся$$$
Flaristan
Цитата(Flaristan @ Jan 8 2012, 16:14) *
Рекомендую - для написания тривиальных эвентов и в качестве удобного пособия примеров для изучения NWN-скриптинга.

Запускаем тулсет, открываем нужную локацию, открываем вкладку с монстрами и жмем кнопку «редактировать и копировать» на понравившемся, делаем что хотим с этим монстром и создаем ему уникальный резреф в конце сохраняя в кастомной своей палитре, копируем этот резреф себе в сторонку.
Скачиваем скрипт генератор, запускаем, выбираем (в окошке вверху слева) тип скрипта «нормальный скрипт», выбираем источник запуска скрипта «ПС входит куда-то», отменяем спец условие, выбираем из списка скриптовых эвентов «сделать если ЭТО тогда ТО условие» и жмем кнопку «скрипт»:
- выбираем тип условия «проверить локальную целочисленную»;
- вводим в поле название для нашей переменной (ну например MONSTER_SPAWN_CHECK);
- выбираем галочку на условие «точно равно»;
- выставляем значение «0»;
- жмем «ок»;
выбираем из списка скриптовых эвентов «спавн созданий» и жмем кнопку «скрипт», заполняем поля:
- «резреф» (копируем его из описалова монстра которого хотим спавнить);
- визуальный эффект спавна (можно не трогать);
- точка спавна – по вейпоинту (указываем таг нашего вейпоинта);
- действия создания при респавне – выбираем «без действия»;
- жмем «ок – выход»;
выбираем из списка скриптовых эвентов «установка локальных переменных» и жмем кнопку «скрипт»:
- выбираем тип переменной «целочисленная» и ставим соответствующий флажок (integer);
- вводим в поле название нашей переменной упомянутое блоком выше (в примере MONSTER_SPAWN_CHECK);
- устанавливаем ее в значение «1»;
- жмем «ок – выход»;
жмем кнопку «окончить текущие если», выбираем вариант «просто закончить», жмем кнопку «закрыть», видим в окошке наш сгенерированный скрипт и комент «поместите на OnEnter»:
Код
//Put this script OnEnter
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;
if (GetLocalInt(oPC, "MONSTER_SPAWN_CHECK")== 0)
   {
   oTarget = GetWaypointByTag("TAG_OF_WAYPOINT ");
   lTarget = GetLocation(oTarget);
   oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "resref_of_creature", lTarget);
   SetLocalInt(oPC, "MONSTER_SPAWN_CHECK", 1);
   }
}

копируем все это дело, жмем «свойства локации» в тулсете, открываем вкладку «события» и ищем окошко «OnEnter», жмем кнопочку чуть правее чтоб открыть редактирование скрипта на этот триггер и вставляем туда этот скопированный из генератора скрипт и сохраняем его под оригинальным именем, ставим на локации вейпоинт упомянутый в скрипте с упомянутым оригинальным тагом («TAG_OF_WAYPOINT» или что там придумается) – это будет точка спавна упомянутого монстра (резреф которого не забываем указать посмотрев в своей кастомной палитре в свойствах монстра).
Жмем в генераторе скриптов кнопку «очистить для нового скрипта», «ок», снова выбираем тип скрипта «нормальный», выбираем стартер «ПС разрушивает/убивает монстра или плейсебл», выбираем че будет если убьет последователь – «отразится на ПС», отменяем наличие спец условия, выбираем из списка скриптовых эвентов «установка локальных переменных» и жмем кнопку «скрипт»:
- выбираем тип переменной «целочисленная» и ставим соответствующий флажок (integer);
- вводим в поле название нашей переменной упомянутое блоками выше (в примере MONSTER_SPAWN_CHECK);
- устанавливаем ее в значение «0»;
- жмем «ок – выход»;
жмем кнопку «закрыть», видим и копируем наш сгенерированный скрипт с пометкой «поместить на OnDeath»:
Код
//Put this script OnDeath
void main()
{
object oPC = GetLastKiller();
while (GetIsObjectValid(GetMaster(oPC)))
   {
   oPC=GetMaster(oPC);
   }
if (!GetIsPC(oPC)) return;
SetLocalInt(oPC, "MONSTER_SPAWN_CHECK", 0);
}

копируем это дело и жмем свойства нашего кастомного монстра с упомянутым резрефом в нашей кастомной палитре, выбираем пункт «событий» и находим триггер «OnDeath», жмем справа чтоб редактировать скрипт и вставляем наш скопированный сохранив его под оригинальным названием.

Итого: имеем локацию; на ней точку респавна монстра (наш вейпоинт); и скрипт на входе в локацию который проверяет игрока в нее входящего на локальную переменную – если игрок уже убивал нашего оригинального монстра или еще не был на этой локации, значит новенький и целенький монстр появится в указанной точке при входе, если уже заходил в локацию но монстра еще не убивал, значит спавнить нового не будем.

Система будет отлично работать для синглплеерного спавна монстра – для мультиплеерного как правило они сложнее и индивидуальнее.
denis0k
Valeroy, скажу грубовато, но прямо - во всём нужно разбираться. Если ничего не изучать самому, а только просить сделать другого и показать, где тут настройки, ничего у тебя не выйдет. Для начала могу посоветовать, как бы странно ни звучало, - погуглить про нвн тулсет. Когда я начинал (лет 9 назад, с сингловых модулей), с интернетом было туго, да и форума этого вроде не было вообще, однако я нашёл себе статьи по тулсету с разжёвыванием всего и вся. Даже кастом контент зацепили. Кажется, они были на сайте либо игромании, либо лки.

Когда выкуришь мануалы с элементарными основами, у тебя не будет вопросов по поводу того, как работает тот же триггер встреч. Скрипты да, в полной мере понятны далеко не всем, но уж выучить настройки плейсов, итемов и триггеров ума много не надо. До кучи, стоит распотрошить все модули под рукой (первым делом - кампанию). К слову, нордок (по крайней мере его версия, доступная для скачивания) в качестве спавнера использует как раз-таки самые обычные триггеры. Гем1 в своё время тоже использовал триггеры для спавна.
Alian REXis
Valeroy, есть тут на форуме такая штука как база скриптов, страница 2 пятый сверху.
Valeroy

Место где появится новый NPC определяется путём выставления вэйпоинтов с названием типа "WPR_"+ тэг_умершего_NPC. Если в начале тэга NPC стоит "NPC_", то эти четыре символа отрежутся.

Может кто нибудь разжевать?

Flaristan спасибо тебе огромное, приду домой буду пробовать, а на мультиплеер разве не пойдут такие скрипты?

А как сделать допустим, чтобы было 4 сундука на боссе и в каждом сундуке были вещи, около 5-7, на каждый класс, и еще чтобы после каждого появления босса вещи тоже появлялись в сундуках, но уже другие, ну с небольшим добавлением
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.