Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Vanes
совершенно не понятно зачем все это вешать на харбит...
ставишь на арене переключатель, который при первом юзе спавнит копию, а при втором ее удаляет... хочешь, все, что есть а арене, хочешь - только свою, и тогда у каждого плеера на арене есть возможность вызвать свою копию...
Zirrex
Vanes, а опыт ты как будешь получать за убитое существо? Потом, а вдруг сражающийся персонаж покинет Арену, и что же будут делать остальные игроки? Если все это делать через переключатель, то на него надо вешать переменную, которая будет срабатывать только тогда, когда ты заплатишь за использование Арены. Только вот ведь какая загвоздка, Арена то используется тем игроком, который покинул сервер.

Идея Арены такая, чтобы на ней за раз мог сражаться только один игрок, а остальные просты бы могли подождать.
[MoF]Darth_Nick
вешаеш переменую на чара и рычаг(имя_фамилия)
когда чар выходит(exit area), сравниваеш его переменую с переменой рычага
если тру - убиваеш копию

так нельзя чтоле?
запутался что-то
azathoth
Zirrex, вот несколько идей по твоему скрипту:

- Во-первых проверка
Neverwinter Script Source
// Отфильтровать ненужные объекты, и заняться поиском существ
    if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
    // Удостовериться, что существо не подпадает под категорию нижеследующих
    if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))


в переборе

Neverwinter Script Source
    // Поиск первого существа в локации
    object oCreature = GetFirstObjectInArea(OBJECT_SELF);

    // Отфильтровать ненужные объекты, и заняться поиском существ
    if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
    // Удостовериться, что существо не подпадает под категорию нижеследующих
    if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))

    // Если существо есть, то продолжить
    while (GetIsObjectValid(oCreature))
    {
        // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
        if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
        {
            // Запомнить существо
            oEnemy = oCreature;
            // Узнать тэг существа
            sCreature = GetTag(oEnemy);

            // Проверить, не мертвое ли оно
            if (GetIsDead(oCreature))
            {
                // Узнать тэг существа
                sEnemy = GetTag(oEnemy);
                // Переключить функцию, чтобы можно было удалить существо
                AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
            }
        }
        // Поиск следующего существа в локации
        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }


будет происходить только один раз только для первого объекта, и первым обьектом в области может быть и не существо, тогда цикл вообще не станет выполняться, а если и будет выполняться, то без нужных проверок. Внеси проверку внутрь цикла, например так:

Neverwinter Script Source
    // Поиск первого существа в локации
    object oCreature = GetFirstObjectInArea(OBJECT_SELF);

    // Если существо есть, то продолжить
    while (GetIsObjectValid(oCreature))
    {
        // Отфильтровать ненужные объекты, и заняться поиском существ
        if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
        // Удостовериться, что существо не подпадает под категорию нижеследующих
        if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))
        // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
        if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
        {
            // Запомнить существо
            oEnemy = oCreature;
            // Узнать тэг существа
            sCreature = GetTag(oEnemy);

            // Проверить, не мертвое ли оно
            if (GetIsDead(oCreature))
            {
                // Узнать тэг существа
                sEnemy = GetTag(oEnemy);
                // Переключить функцию, чтобы можно было удалить существо
                AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
            }
        }
        // Поиск следующего существа в локации
        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }
, то же самое для перебора в конце

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

-

Neverwinter Script Source
// Найти первого персонажа
    object oPlayer = GetFirstPC();

    // Если персонаж есть, то продолжить
    while (GetIsObjectValid(oPlayer))
    {
        // Узнать паблик персонажа
        sPlayer = GetPCPublicCDKey(oPlayer);

        // Удостовериться, что персонаж на Арене
        if (GetTag(GetArea(oPlayer)) != "amen_gt_arena") return;


Если первый зашедший на сервер персонаж не на арене, то скрипт вообще перестанет выполняться.
Zirrex
azathoth, проверка на тип объекта у меня стоит внутри цикла. Это я в этом примере вынес наружу, чтобы убедиться, что это неверно smile.gif Комментариев в оригинальном скрипте у меня нет. Я их добавил тут для того, чтобы сторонний наблюдатель мог разобраться в скрипте.

В этом коде:
Neverwinter Script Source
if (GetTag(GetArea(oPlayer)) != "amen_gt_arena") return;

достаточно убрать 'return', и изменить скрипт на:
Neverwinter Script Source
if (GetTag(GetArea(oPlayer)) == "amen_gt_arena")

как все должно заработать.

Какие еще ошибки? Это то я исправлю, но суть проблемы не изменится.

[MoF]Darth_Nick, нельзя так. Вся информация о персонаже становится недоступной, когда он выходит с сервера. Да и запутался я в этих переменных, вроде бы все верно, а работать не желает. Даже пробовал присваивать переменную копии, а потом уж по ней выявлять существ, и все равно не работало.

Смотри, самый простой пример, вешаю переменную на персонажа в момент активации сражения. Переменная становится равной 1. Персонаж резко выходит с модуля. На выходе с локации стоит скрипт, который проверяет, висит ли эта переменная на выходящем существе или нет, если висит, то сбросить на 0. Только вся беда в том, что когда персонаж покидает не локацию, а модуль, то скрипт не успевает проверить переменную. Почему? Я не знаю. Зачем вообще делать действие LeaveModule, если оно не умеет правильно работать с выходящими персонажами?
azathoth
Комментариев в оригинальном скрипте у меня нет. Я их добавил тут для того, чтобы сторонний наблюдатель мог разобраться в скрипте.
Мало помогают, вместо того, чтобы писать, что делает каждая отдельная команда (что и так ясно из ее названия) лучше написать, что делает тот или иной блок команд, например, что ищет тот или иной цикл.

Что означает nCreature я так и не понял =)

Но почему он устанавливается в ТRUE скажу:
Neverwinter Script Source
int nCreature = FALSE;
    .......
    while (GetIsObjectValid(oPlayer))
    {
        sPlayer = GetPCPublicCDKey(oPlayer);

        // Удостовериться, что персонаж на Арене
        if (GetTag(GetArea(oPlayer)) != "amen_gt_arena") return;

        // Сравнить паблик с тэгом найденного существа, проверяя первые 8 знаков слева
        if (GetStringLeft(sCreature, 8) == sPlayer)
        {
            nCreature = FALSE;
        }
        else
        {
            nCreature = TRUE;
        }
     ............
        oPlayer = GetNextPC();
    }

Первый проход цикла: Паблик первого персонажа совпал, переменная FALSE, второй проход - паблик не совпал, переменная в TRUE, и монстр удаляется.

Избежать можно например так:
Neverwinter Script Source
int nCreature = TRUE;
    .......
        if (GetStringLeft(sCreature, 8) == sPlayer)
        {
            nCreature = FALSE;
        }

    // без 'else'
     ............
        oPlayer = GetNextPC();
    }


А вообще слишком запутанно, вот так вроде бы логичнее (алгоритм тот же), написал пока разбирал:
Neverwinter Script Source
void main()
{
    object oMod = GetModule();

    string sEnemy, sPlayer, sPerson = "";
    object oEnemy = OBJECT_INVALID;

    // Поиск врага на арене
    object oCreature = GetFirstObjectInArea(OBJECT_SELF);
    while (GetIsObjectValid(oCreature))
    {
        if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
        if (!GetIsDM(oCreature) && !GetIsPC(oCreature) && !GetIsDMPossessed(oCreature))
        // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
        if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
        {
            oEnemy = oCreature;

            // если сущ-во убито
            if (GetIsDead(oCreature))
            {
                object oPC = GetLastAttacker(oEnemy);
                sPerson = GetPCPublicCDKey(oPC);
                sEnemy = GetTag(oEnemy);
                // нужным игроком
                if (GetStringLeft(sEnemy, 8) == sPerson)
                if (GetHitDice(oPC) < 4)
                {
                    int nXP = GetXP(oPC);
                    int nHD = GetHitDice(oPC) + 1;
                    int nMin = (50 * nHD);
                    // выдать бонусный опыт
                    SetXP(oPC, nXP + nMin);
                }

                // убрать труп
                AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));

                // бой окончен
                SetLocalInt(oMod, "WorkArena", FALSE);

                return;
            }
        }

        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }

    if (!GetIsObjectValid(oEnemy)) return; // сущ-ва нет и проблем нет

    int bDestroy = TRUE; // нужно ли удалять?

    object oPlayer = GetFirstPC();
    while (GetIsObjectValid(oPlayer))
    {
        // Удостовериться, что персонаж на Арене
        if (GetTag(GetArea(oPlayer)) == "amen_gt_arena")
        {
            sPlayer = GetPCPublicCDKey(oPlayer);
            sEnemy = GetTag(oEnemy);
            // найден подходящий персонаж, значит идет бой, удалять не надо
            if (GetStringLeft(sEnemy, 8) != sPlayer)
            {
                bDestroy = FALSE;
            }
        }

        oPlayer = GetNextPC();
    }

    if (!bDestroy) return; // идет сражение, удалять не надо

    // игрока нет, а сущ-во есть - удалить сущ-во
    object oMonster = GetFirstObjectInArea(OBJECT_SELF);
    while (GetIsObjectValid(oMonster))
    {
        if (GetObjectType(oMonster) == OBJECT_TYPE_CREATURE)
        if (!GetIsDM(oCreature) && !GetIsPC(oCreature) && !GetIsDMPossessed(oCreature))
        // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
        if (GetStringRight(GetTag(oMonster), 6) == "_enemy")
        {
            // Удалить существо
            AssignCommand(oMonster, ClearAllActions(TRUE));
            AssignCommand(oMonster, SetIsDestroyable(TRUE, FALSE, FALSE));
            DestroyObject(oMonster);

            SetLocalInt(oMod, "WorkArena", FALSE);
        }

        oMonster = GetNextObjectInArea(OBJECT_SELF);
    }
}


P.S. проверка
Neverwinter Script Source
if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))

будет всегда верна, так как пройдет если существо ИЛИ ни дм ИЛИ не игрок, что-нибудь да и верно, по-видимому нужно так:
Neverwinter Script Source
if (!GetIsDM(oCreature) && !GetIsPC(oCreature) && !GetIsDMPossessed(oCreature))
Zirrex
azathoth, спасибо за помощь, но я успел перекроить код и немного его оптимизировать. Вот что получилось. Столько лишнего кода оказалось smile.gif Второй цикл поиска существа я убрал, потому что можно работать и без него с объектом 'oEnemy = oCreature;'. Сразу этого не заметил, а одна строчка сильно разгружает код.

Neverwinter Script Source
void main()
{
    object oMod = GetModule();

    string sCreature = "";
    object oEnemy = OBJECT_INVALID;
    object oPC;

    object oCreature = GetFirstObjectInArea(OBJECT_SELF);

    while (GetIsObjectValid(oCreature))
    {
        if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
        if (!(GetIsDM(oCreature) || GetIsPC(oCreature) || GetIsDMPossessed(oCreature)))

        if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
        {
            oEnemy = oCreature;
            sCreature = GetTag(oEnemy);

            if (GetIsDead(oCreature))
            {
                oPC = GetLastAttacker(oEnemy);
                AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));

                if (GetHitDice(oPC) > 3) return;

                if (GetStringLeft(sCreature, 8) == GetPCPublicCDKey(oPC))
                {
                    int nXP = GetXP(oPC);
                    int nLevel = GetHitDice(oPC);
                    int nHD = nLevel + 1;
                    int nMin = (50 * nHD);
                    SetXP(oPC, nXP + nMin);
                }
                return;
            }
            break;
        }
        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }

    if (!GetIsObjectValid(oEnemy)) return;

    int nKey = TRUE;

    object oPlayer = GetFirstPC();

    while (GetIsObjectValid(oPlayer))
    {
        if (GetTag(GetArea(oPlayer)) == "amen_gt_arena")
        {
            if (GetStringLeft(sCreature, 8) == GetPCPublicCDKey(oPlayer))
            {
                nKey = FALSE;
            }
        }
        oPlayer = GetNextPC();
    }

    if (nKey)
    {
        if (GetIsObjectValid(oEnemy))
        {
            AssignCommand(oEnemy, ClearAllActions(TRUE));
            AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
            DestroyObject(oEnemy);
        }
        SetLocalInt(oMod, "WorkArena", FALSE);
    }
}

Просмотрел твою редакцию кода, и вижу что немного не понял сути. 'bDestroy = FALSE' будет до тех пор, пока на Арене не появится персонаж с условием:
Neverwinter Script Source
if (GetStringLeft(sEnemy, 8) == sPlayer)

Условие отрицания не сработает, и ключ 'bDestroy' останется 'TRUE'. Далее, если персонаж с условием
Neverwinter Script Source
if (GetStringLeft(sEnemy, 8) == sPlayer)

войдет на Арену, то появившийся враг тут же пропадет. А если быстро выйдет, до срабатывания хартбита, то враг останется на Арене smile.gif

Переменную 'SetLocalInt(oMod, "WorkArena", FALSE);' мне нельзя делать 'FALSE' сразу после убийства врага, потому что врагов может быть двое или трое.
mamuc
посмотрел я заметил (как мне кажеться) вот что
- в скрипте не с того угла танцуете biggrin.gif ..ведь первое, что надо проверить - это есть ил и нет игрок на арене, а потом уже смотрет какие кричи, что там делают

ну и в итоге вот что получилось
Neverwinter Script Source
object GetAmenArenaPC(object oArea)
{
    object oPC = OBJECT_INVALID;
    object oCreature = GetFirstObjectInArea(oArea);
    if (!GetIsObjectValid(oCreature)) { return oPC; }
    while (GetIsObjectValid(oCreature))
    {
       if (GetIsPC(oCreature)) { oPC =oCreature; }
       oCreature = GetNextObjectInArea(oArea);
    }
    return oPC;
}

void main()
{
    object oMod = GetModule();
    object oArea = OBJECT_SELF;
    string sCreature = "";
    object oEnemy = OBJECT_INVALID;
    object oCreature;
    object oPC = GetAmenArenaPC(oArea);
    if (oPC==OBJECT_INVALID)
    {
        // kill all creature in area
        oCreature = GetFirstObjectInArea(oArea);
        while (GetIsObjectValid(oCreature))
        {
            if (!GetIsDM(oCreature) || GetIsDMPossessed(oCreature))
            {
                DestroyObject(oCreature);
            }
            oCreature = GetNextObjectInArea(oArea);
        }
        //Arena clear - aviable for next player
        SetLocalInt(oMod, "WorkArena", TRUE);
        return;
    }
    // player in arena - closed for next player
    SetLocalInt(oMod, "WorkArena", FALSE);
    oCreature = GetFirstObjectInArea(oArea);
    while (GetIsObjectValid(oCreature))
    {
        if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
        {
           if (!GetIsDMPossessed(oCreature))
           {
                if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
                {
                    oEnemy = oCreature;
                    sCreature = GetTag(oEnemy);

                    if (GetIsDead(oCreature))
                    {
                        AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
                        if (GetHitDice(oPC) <= 3)
                        {
                            if (GetStringLeft(sCreature, 8) == GetPCPublicCDKey(oPC))
                            {
                                int nXP = GetXP(oPC);
                                int nLevel = GetHitDice(oPC);
                                int nHD = nLevel + 1;
                                int nMin = (50 * nHD);
                                SetXP(oPC, nXP + nMin);
                            }
                        }
                    }
                    else
                    {
                        // esli vdrug na arene chuzhoj dvojnik
                        if (GetStringLeft(sCreature, 8) != GetPCPublicCDKey(oPC))
                        {
                            AssignCommand(oEnemy, ClearAllActions(TRUE));
                            AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
                            DestroyObject(oEnemy);
                        }
                    }
                }
            }
        }
        oCreature = GetNextObjectInArea(oArea);
    }
}
NedWarN
Всё Мужики Помираю срочно Хелп.
Вот такая Проблемка.
1. Ставлю локалку на ондед Босса.
Neverwinter Script Source
SetLocalInt(GetLastKiller(),"DED",1);

2. В скрипте Кат Сценки Проверяю на Локалку. И канечно же ничо не Пашит Хелп. плиз.
Neverwinter Script Source
void Create()
{
object oCreate = GetObjectByTag("WG_WHITE_EFFECT");
object oEfCre = CreateObject(OBJECT_TYPE_CREATURE,"NewTag",GetLocation(oCreate),TRUE,"NewTag");
}
#include "x2_inc_cutscene"
int CUTSCENE_NUMBER = 5217;
void main()
{
  int nDED = GetLocalInt(GetEnteringObject(), "DED");
  int nDoOnce = GetLocalInt(GetArea(OBJECT_SELF), "CUT_Map_E3S");
  object oPC = GetEnteringObject();
  object oMagz = GetObjectByTag("WG_SUPER_BOSS");
  object oWP = GetWaypointByTag("WG_GO_BOSS");
  object oEffect = GetObjectByTag("WG_WHITE_EFFECT");
  object oCam = GetWaypointByTag("WG_CAM_PC_BOSS");
  effect eMo5 = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
  effect eLi1 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_5);
  effect eLi2 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_10);
  effect eLi3 = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_15);
  effect eLi4 = EffectVisualEffect(VFX_IMP_HEALING_X);
  effect eLi5 = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "LOK_CUT"))
{return;}
//
if(nDoOnce == 1)
return;
  {
  SetLocalInt(GetArea(OBJECT_SELF), "CUT_Map_E3S", 1);
  ExploreAreaForPlayer(GetArea(oPC), oPC);
  }
  if (!(nDED == 1))
  {
  SetCutsceneMode(oPC);// Minu and du for Disable/ is cut-scene.
//-------------------------------------------
CutSetActiveCutscene(CUTSCENE_NUMBER, CUT_DELAY_TYPE_CUMULATIVE);
CutSetActiveCutsceneForObject(oPC, CUTSCENE_NUMBER, TRUE);
CutSetActiveCutsceneForObject(OBJECT_SELF, CUTSCENE_NUMBER);
CutSetCutsceneMode(0.2, oPC, TRUE, CUT_CAMERA_HEIGHT_MEDIUM, TRUE, TRUE);
CutFadeOutAndIn(0.0, oPC, 1.5);
CutSetLocation(0.0, oPC);
AssignCommand(oPC,ActionJumpToObject(oCam,FALSE));
DelayCommand(0.0, AssignCommand(oPC, ClearAllActions()));
DelayCommand(0.7, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
DelayCommand(2.5, FadeFromBlack(oPC, FADE_SPEED_FAST));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMo5, oPC);
CutSetCamera(0.0, oPC, CAMERA_MODE_TOP_DOWN, 80.0, 0.0, 79.0, CAMERA_TRANSITION_TYPE_VERY_FAST);
DelayCommand(5.0, AssignCommand(oPC, SetCameraFacing(280.0, 0.0, 79.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
DelayCommand(6.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi1, oEffect, 1.0));
DelayCommand(7.7, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi2, oEffect));
DelayCommand(9.7, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi3, oEffect));
DelayCommand(7.0, AssignCommand(oPC, SetCameraFacing(80.0, 3.0, 58.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
DelayCommand(10.2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi4, oEffect));
DelayCommand(11.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi5, oEffect));
DelayCommand(11.5, AssignCommand(oMagz,ActionJumpToObject(oEffect,FALSE)));
DelayCommand(11.5, Create());
}
}
StalkerDtN
Опиши ситуацию подробнее...у тебя сценка должена запускаться когда босс жив или все же когда погибает.
Zirrex
mamuc, спасибо, я попробую этот скрипт, только есть несколько но, переменную 'WorkArena' мне нужно изменять только тогда, когда нет игрока, с которого создалась копия, если он вышел с поля Арены или из игры.
-fenix-
Цитата
2. В скрипте Кат Сценки Проверяю на Локалку. И канечно же ничо не Пашит Хелп. плиз.

И правильно делает, я бы то же не пахал, когда говорят не пахать!!!
Neverwinter Script Source
if (!(nDED == 1))

У тебя тут отрицание стоит, при чем очень странное - этот скрипт вообще ни когда не выполнится, так как в проверке локалка забыта. Ты зачем-то устанавливаешь в nDED единицу, а потом ставешь отрицание.
Выглядеть должно так
Neverwinter Script Source
if (nDED == 1)
//или так
if (nDED)
Zirrex
NedWarN, скрипт конечно еще тот. Учись писать красиво скрипты, иначе сразу разобраться очень тяжело. Переписал его, кое-что подправив. Не знаю для чего именно тебе две переменных, но видимо где-то используются, поэтому оставил.

Neverwinter Script Source
void Create()
{
    object oCreate = GetObjectByTag("WG_WHITE_EFFECT");
    object oEfCre = CreateObject(OBJECT_TYPE_CREATURE, "NewTag", GetLocation(oCreate), TRUE);
}

#include "x2_inc_cutscene"

int CUTSCENE_NUMBER = 5217;

void main()
{
    object oPC = GetEnteringObject();
    object oNPC = OBJECT_SELF;

    if (!GetIsPC(oPC) || GetLocalInt(oNPC, "LOK_CUT"))
    {
        return;
    }

    int nDED = GetLocalInt(oPC, "DED");
    int nDoOnce = GetLocalInt(GetArea(oNPC), "CUT_Map_E3S");

    object oMagz = GetObjectByTag("WG_SUPER_BOSS");
    object oWP = GetWaypointByTag("WG_GO_BOSS");
    object oEffect = GetObjectByTag("WG_WHITE_EFFECT");
    object oCam = GetWaypointByTag("WG_CAM_PC_BOSS");

    effect eMo5 = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
    effect eLi1 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_5);
    effect eLi2 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_10);
    effect eLi3 = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_15);
    effect eLi4 = EffectVisualEffect(VFX_IMP_HEALING_X);
    effect eLi5 = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);

    if (nDoOnce != 1)
    {
        SetLocalInt(GetArea(oNPC), "CUT_Map_E3S", 1);
        ExploreAreaForPlayer(GetArea(oPC), oPC);
    }

    if (nDED != 1)
    {
        SetCutsceneMode(oPC);// Minu and du for Disable/ is cut-scene.
        //-------------------------------------------
        CutSetActiveCutscene(CUTSCENE_NUMBER, CUT_DELAY_TYPE_CUMULATIVE);
        CutSetActiveCutsceneForObject(oPC, CUTSCENE_NUMBER, TRUE);
        CutSetActiveCutsceneForObject(oNPC, CUTSCENE_NUMBER);
        CutSetCutsceneMode(0.2, oPC, TRUE, CUT_CAMERA_HEIGHT_MEDIUM, TRUE, TRUE);
        CutFadeOutAndIn(0.0, oPC, 1.5);
        CutSetLocation(0.0, oPC);
        AssignCommand(oPC, ActionJumpToObject(oCam, FALSE));
        DelayCommand(0.0, AssignCommand(oPC, ClearAllActions()));

        DelayCommand(0.7, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
        DelayCommand(2.5, FadeFromBlack(oPC, FADE_SPEED_FAST));

        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMo5, oPC);
        CutSetCamera(0.0, oPC, CAMERA_MODE_TOP_DOWN, 80.0, 0.0, 79.0, CAMERA_TRANSITION_TYPE_VERY_FAST);

        DelayCommand(5.0, AssignCommand(oPC, SetCameraFacing(280.0, 0.0, 79.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
        DelayCommand(6.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi1, oEffect, 1.0));
        DelayCommand(7.7, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi2, oEffect));
        DelayCommand(9.7, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi3, oEffect));

        DelayCommand(7.0, AssignCommand(oPC, SetCameraFacing(80.0, 3.0, 58.0, CAMERA_TRANSITION_TYPE_MEDIUM)));
        DelayCommand(10.2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi4, oEffect));
        DelayCommand(11.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLi5, oEffect));

        DelayCommand(11.5, AssignCommand(oMagz, ActionJumpToObject(oEffect,FALSE)));

        DelayCommand(11.5, Create());
    }
}
mamuc
Цитата
mamuc, спасибо, я попробую этот скрипт, только есть несколько но, переменную 'WorkArena' мне нужно изменять только тогда, когда нет игрока, с которого создалась копия, если он вышел с поля Арены или из игры.

... а оно и меняеться реально только тогда , когда на арене нету игрока..а в остальное время оно FALSE biggrin.gif
virusman
Вот кусок скрипта официантки.
Нужно, чтобы она шла так, как нужно, и при этом не зависала и не прерывалась.
Попробовал делать блокировку/разблокировку очереди - официантка подбегает и ничего не делает.
(Скрипт висит на OnConversation)
Neverwinter Script Source
void CheckIsHere(object oTarget, string sOrder)
{
    if(GetDistanceBetween(OBJECT_SELF, oTarget) < 4.0)
    {
        ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0);
        ActionDoCommand(_CreateItemOnObject(sOrder, oTarget));
    }
    else
    {
        SpeakString("Куда вы ушли??");
        ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 1.0);
        ActionDoCommand(_CreateObject(OBJECT_TYPE_ITEM, sOrder, GetLocation(OBJECT_SELF), TRUE));
    }
    ActionDoCommand(SetLocalInt(OBJECT_SELF, "vir_waiter_busy", FALSE));

    //заблокировать и разблокировать очередь
    DelayCommand(0.1, SetCommandable(FALSE));
    AssignCommand(OBJECT_SELF, ActionDoCommand(SetCommandable(TRUE)));
}

void GoToObject(object oTarget, float fTimeout)
{
    ActionForceMoveToLocation(GetLocation(oTarget), TRUE, fTimeout);
    ActionDoCommand(SetFacingPoint(GetPosition(oTarget)));
}

void WalkToObject(object oTarget, float fTimeout)
{
    ActionForceMoveToObject(oTarget, TRUE, 2.0, fTimeout);
    ActionDoCommand(SetFacingPoint(GetPosition(oTarget)));
    ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0);

    //заблокировать и разблокировать очередь
    DelayCommand(0.1, SetCommandable(FALSE));
    AssignCommand(OBJECT_SELF, ActionDoCommand(SetCommandable(TRUE)));
}

void GoToPlayer(object oTarget, string sOrder, float fTimeout)
{
    ActionForceMoveToLocation(GetLocation(oTarget), TRUE, fTimeout);
    ActionDoCommand(SetFacingPoint(GetPosition(oTarget)));
    ActionDoCommand(CheckIsHere(oTarget, sOrder));

    //заблокировать и разблокировать очередь
    DelayCommand(0.2, SetCommandable(FALSE));
    AssignCommand(OBJECT_SELF, ActionDoCommand(SetCommandable(TRUE)));
}

void GiveBottleTo(object oPC, string sOrder)
{
    if (oPC != oShouter)
        oPotionWaypoint = GetNearestObjectByTag(sPotionWaypointTag,oPC);
    if (GetDistanceBetween(oPC, oPotionWaypoint)<=2.5)
    {
        WalkToObject(oPotionWaypoint, 15.0);
        ActionDoCommand(_CreateObject(OBJECT_TYPE_ITEM, sOrder, RandomLocationFrom(GetLocation(oPotionWaypoint), 0.2, 0.2),TRUE));
    }
    else
    {
        GoToPlayer(oPC, sOrder, 15.0);
        //ActionDoCommand(_CreateItemOnObject(sOrder, oPC));
    }
}

void main()
{
    nGroupSize = 1;
    oShouter = GetLastSpeaker();
    oPotionWaypoint = GetNearestObjectByTag(sPotionWaypointTag,oShouter);
    object oCurrentClient = GetLocalObject(OBJECT_SELF, "vir_waiter_client");
   
    //пропущено:
    //распознавание того, что сказал игрок, проверки и т.д....
   
    //Busy: если официантка занята
    if (GetLocalInt(OBJECT_SELF, "vir_waiter_busy")==TRUE)
    {
        SpeakString("Подождите, пока я освобожусь");
        return;
    }

    ClearAllActions();
    SetLocalInt(OBJECT_SELF, "vir_waiter_busy", TRUE);

    //пропущено:
    //берем деньги...

    if (nGroupOrder == TRUE)
    {
        SpeakString("Group order processing...");
        oGroupMember = GetFirstFactionMember(oShouter);
        while(GetIsObjectValid(oGroupMember))
        {
            if(GetObjectSeen(oGroupMember)) GiveBottleTo(oGroupMember, sOrder);
            oGroupMember = GetNextFactionMember(oShouter);
        }
    }
    else
    {
        GiveBottleTo(oShouter, sOrder);
    }

    ActionDoCommand(SetLocalInt(OBJECT_SELF, "vir_waiter_busy", FALSE)); //освобождаем официантку

    DelayCommand(0.2, SetCommandable(FALSE));
    AssignCommand(OBJECT_SELF, ActionDoCommand(SetCommandable(TRUE)));
DEM
А нельзя сделать что бы она просто шла по вейпоинтам? Например пошла к такому-то вейпоинты, через пять сек к другому и т.д. Или я чего-то не понял...
Aiwan
Везде где юзаешь Делей, попробуй сделать так:
Neverwinter Script Source
void ActionCreateObject(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag="")
{
  CreateObject(nObjType, sCreature, lLoc, FALSE, sNewTag);
}


void CheckIsHere(object oTarget, string sOrder)
{
    object oSelf = OBJECT_SELF;

    if(GetDistanceBetween(oSelf, oTarget) < 4.0)
    {
        AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0));
        CreateItemOnObject(sOrder, oTarget, 1);
    }
    else
    {
        SpeakString("Куда вы ушли??");
        ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 1.0);
        ActionCreateObject(OBJECT_TYPE_ITEM, sOrder, GetLocation(OBJECT_SELF), TRUE);
    }
    AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf, "vir_waiter_busy", FALSE)));

    //заблокировать и разблокировать очередь
    AssignCommand(oSelf, ActionDoCommand(SetCommandable(TRUE, oSelf)));
    DelayCommand(0.3, SetCommandable(FALSE, oSelf));
}
virusman
Спасибо, завтра попробую..
Но всё же, как я понимаю, многократная блокировка-разблокировка оставляет возможность (в течение 0.2-0.3 с) сбить работу официантки.
NedWarN
-fenix- Zirrex.
Сорри когда писал немного "Принял" ибо без смазки немагу.
Аба на трезвую голову взглянул и всё заработало гг.
if (!(nDED == 1)) return;
вот так надо! было. хоть бы один сказал. smile.gif
mamuc
Цитата
if (!(nDED == 1)) return;


а не проще ли if (nDED != 1) return;
Aiwan
Цитата(mamuc @ Сегодня, 11:51) [snapback]71557[/snapback]
а не проще ли if (nDED != 1) return;

Проще так:
Neverwinter Script Source
if (!nDED) return;

Zirrex
NedWarN, обычно пишут так:
Neverwinter Script Source
if (nDED != 1) return;

Это будет правильней, чем то что ты написал.

Если же у тебя много отрицаний, то можно написать так:
Neverwinter Script Source
if (!(nVariable1 == 1 || nVariable2 == 1 || nVariable3 == 1)) return;


Aiwan, а я бы все же проверял так, как описали мы с Мамуком, потому что такой способ более надежный.
mamuc
Цитата
Проще так:

Neverwinter Script Source
if (!nDED) return;

Aiwan это только когда nDED может принять лишь 2 значения(0 и 1 или TRUE/FALSE) ..а если их больше 2 используються, то лучше как мы с Zirrex написали
Aiwan
Цитата(mamuc @ Сегодня, 12:24) [snapback]71570[/snapback]
Aiwan это только когда nDED может принять лишь 2 значения(0 и 1 или TRUE/FALSE) ..а если их больше 2 используються, то лучше как мы с Zirrex написали

Сорри. Я то не глянул, сколько у вас значений pardon.gif

Цитата(Zirrex @ Сегодня, 12:01) [snapback]71566[/snapback]
Aiwan, а я бы все же проверял так, как описали мы с Мамуком, потому что такой способ более надежный.

Там же у Мамука было слово ПРОЩЕ. pleasantry.gif

Про НАДЕЖНО никто не говорил. blum3.gif
lowlock
Люди, подскажите пожалуйсто. Как мне сделать так, что-бы когда я кольцо одевал сразу появлялся эффект невидимости? или перехода местности
Nuprahtor
Помогите чайнику пожалуйста!
Мне нужно, чтобы с убитым монстром (медведь) можно было начать диалог (вырезка шкуры), и чтобы труп пропал через столько-то секунд.
Спасибо за внимание.
azathoth
QUOTE
Люди, подскажите пожалуйсто. Как мне сделать так, что-бы когда я кольцо одевал сразу появлялся эффект невидимости? или перехода местности


Отследить надевание кольца событием OnPlayerEquipItem и наложить эффект / телепортировать.

QUOTE(Nuprahtor @ Сегодня, 10:34) [snapback]71727[/snapback]
Мне нужно, чтобы с убитым монстром (медведь) можно было начать диалог (вырезка шкуры), и чтобы труп пропал через столько-то секунд.


С самим убитым монстром поговорить не удастся. После смерти монстра (медведя) создавай невидимый объект, на OnUsed которого и начинай диалог (через действие ActionStartConversation). Нужно чтобы труп пропал через сколько-то секунд после чего? Вот отследи это что-то и удали невидимый объект с медведем через задержку:

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)
Nuprahtor
Я же пока ЧАЙНИК!
Хотя генератор скриптов Лилака поможет создать обьект, но как его удалить через какой нибудь промежуток времени?
Например через 120 секунд?На хертбит.А как?
И, если не трудно, можете написать скрипт?Пожалуйста, и спасибо за все!
azathoth
На хатбит неудобно.
Вот примерно как может выглядеть эта часть (ОnDeath существа):
NSS
void main()
{
    // создание невидимого объекта на месте смерти миши
    location lLocation = GetLocation(OBJECT_SELF);
    object oInvisible = CreateObject(OBJECT_TYPE_PLACEABLE, "XXX", lLocation);

    // убирание объекта
    DelayCommand(120.0, DestroyObject(oInvisible));
}

, где XXX - чертеж невидимого тела

также можешь использовать такое удаление с задержкой:

NSS
DestroyObject(oInvisible, 120.0);

, но обычно перед удалением нужно делать различные проверки, например не идет ли сейчас разговор и игроком.
Zirrex
azathoth, зачем через Delay? Есть же хорошая функция:

NSS
// Set the destroyable status of the caller.
// - bDestroyable: If this is FALSE, the caller does not fade out on death, but
//  sticks around as a corpse.
// - bRaiseable: If this is TRUE, the caller can be raised via resurrection.
// - bSelectableWhenDead: If this is TRUE, the caller is selectable after death.
void SetIsDestroyable(int bDestroyable, int bRaiseable=TRUE, int bSelectableWhenDead=FALSE)

Проверяется раса, а если уж нужно точно, то тэг существа. В момент смерти для него переключается флажок, не удалять существо:

NSS
SetIsDestroyable(FALSE, FALSE, FALSE);

На невидимый объект вешается скрипт, который проверяет в момент закрытия инвентаря, осталось там что-нибудь, если нет, удалить все содержимое, и конечно же сбросить функцию:
NSS
SetIsDestroyable(TRUE, FALSE, FALSE);


Nuprahtor

В скрипте "nw_c2_default7"

NSS
// Очистка всего инвентаря и удаление экипировки, если есть
void ClearInventory(object oCorpse)
{
    int nGold = GetGold(oCorpse);

    if (nGold) TakeGoldFromCreature(nGold, oCorpse, TRUE);

    int i;

    for (i = 0; i < 18 ; i++)
    {
        object oEquip = GetItemInSlot(i, oCorpse);

        if (GetIsObjectValid(oEquip))
        {
            DestroyObject(oEquip);
        }
    }

    object oLoot = GetFirstItemInInventory(oCorpse);

    while (GetIsObjectValid(oLoot))
    {
        DestroyObject(oLoot);
        oLoot = GetNextItemInInventory(oCorpse);
    }
}

void CreateCorpse(object oCreature)
{
    object oKiller = GetLastKiller();      // Убийца
    object oCreature = OBJECT_SELF;        // Погибшее существо
    string sTag = GetTag(oCreature);        // Тэг существа

    int nCorpseFade    = 120// Задержка исчезновения тела существа.
    int nKeepEmpties    = FALSE; // Вкл., если хотите удалять тела существ моментально.

    // Узнать точку гибели существа
    location lCorpse = GetLocation(oCreature);

    // Защита существа от удаления
    SetIsDestroyable(FALSE, FALSE, FALSE);

    if (nKeepEmpties)
    {
        nCorpseFade = 0;
    }

    // Создание пятна крови
    object oBlood = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_bloodstain", lCorpse, FALSE);
    // Создание невидимого объекта, который можно открыть
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "corpse_object", lCorpse, FALSE);

    // Сохранение объектов, с которыми надо еше работать
    SetLocalObject(oCorpse, "Blood", oBlood);
    SetLocalObject(oCorpse, "Corpse", oCreature);
    SetLocalInt(oCorpse, "KeepEmpty", nKeepEmpties);

    // Создание шкурки медвеля
    if (GetTag(oCreature) == "tag_creature")
    {
        object oSkin = CreateItemOnObject("skin_bear", oCorpse)
    }

    // Проверка первой вещи в инвенторе
    object oHasInventory = GetFirstItemInInventory(oCorpse);

    // Если в инвентаре существа ничего нет, то удалить тело
    if (oHasInventory == OBJECT_INVALID)
    {
        ClearInventory(oCreature);
        ClearInventory(oCorpse);
        DestroyObject(oCorpse);
        DestroyObject(oBlood);
        SetIsDestroyable(TRUE, FALSE, FALSE);
        DestroyObject(oCreature, 1.0);
    }
    // Удаление тела существа по истечение времени
    else if (nCorpseFade > 0)
    {
        float fCorpseFade = IntToFloat(nCorpseFade);
        DelayCommand(fCorpseFade, ClearInventory(oCreature));
        DelayCommand(fCorpseFade, ClearInventory(oCorpse));
        DelayCommand(fCorpseFade, DestroyObject(oBlood));
        DelayCommand(fCorpseFade + 0.1, DestroyObject(oCorpse));
        DelayCommand(fCorpseFade + 0.2, SetIsDestroyable(TRUE, FALSE, FALSE));
        DelayCommand(fCorpseFade + 0.2, DestroyObject(oCreature));
    }
}

void main()
{
    object oKiller = GetLastKiller();

    if (GetLastKiller() == OBJECT_SELF) return;

    if (GetRacialType(OBJECT_SELF) == RACIAL_TYPE_ANIMAL)
    {
        CreateCorpse(OBJECT_SELF);
    }
}


На предмете "corpse_object" в действии OnDisturbed

NSS
// Очистка всего инвентаря и удаление экипировки
void ClearInventory(object oCorpse)
{
    // аналогичен скрипту выше
}

void main()
{
    object oCorpse = OBJECT_SELF;

    // Просмотр нужных объектов и переменных
    object oBlood = GetLocalObject(oCorpse, "Blood");
    object oBody = GetLocalObject(oCorpse, "Corpse");
    int nKeepEmpty = GetLocalInt(oCorpse, "KeepEmpty");

    // Проверка первой ячейки инвентаря
    object oHasInventory = GetFirstItemInInventory(oCorpse);

    // Если инвентарь пуст, проверить значение "KeepEmpty"
    if (oHasInventory == OBJECT_INVALID)
    {
        if (!nKeepEmpty)
        {
            ClearInventory(oBody);
            ClearInventory(oCorpse);
            DestroyObject(oCorpse);
            DestroyObject(oBlood);
            AssignCommand(oBody, SetIsDestroyable(TRUE, FALSE, FALSE));
            DestroyObject(oBody, 1.0);
        }
    }
}

Чтобы начать диалог, необходимо повесить на объект "corpse_object" в действии OnUsed скрипт:

NSS
void main()
{
    ActionStartConversation(GetLastUsedBy(), "dialog", TRUE, FALSE);
}

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

Если не все понятно, или не работает, пиши. Полностью все не проверял, потому что брал готовый скрипт, где гораздо больше объектов.
Dimanische
Люди подскажите пажаласта как можно сделать чтобы монстры не мочили друг-друга магией если они в одной фракции.
Извените если на этот вопрос уже отвечали.
Aiwan
В каком смысле? Объясни ситуацию? Идет бой, монстры сражаются и задевают друг друга магией? Верно?
dumbo
QUOTE(Dimanische @ Сегодня, 14:12) [snapback]71834[/snapback]
Люди подскажите пажаласта как можно сделать чтобы монстры не мочили друг-друга магией если они в одной фракции.

если я правильно въехал в вопрос, то в свойствах локации Area -> Properties -> Advanced -> Player vs. Player = Party protected. также есть глобальная опция с тем же смыслом.
Zirrex
dumbo, а если на всех локациях стоит Full PvP, и именно такая политика шарда? Нет, это не годится. Лишь как крайняя мера.

Dimanische, можно пойти путем, как описал dumbo, а можно подредактировать все площадные заклинания, в которых указать, что если противник враг, то атаковать его, а если нет, то игнорировать.
Existor
Как вариант - поставить средние настройки сложности сервера.
Dimanische
Про средние настройки сложности понятно. Мне просто хотелось бы чтобы на максимальной сложности они не задевали друг-друга.
QUOTE
Объясни ситуацию?

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

QUOTE
Dimanische, можно пойти путем, как описал dumbo, а можно подредактировать все площадные заклинания, в которых указать, что если противник враг, то атаковать его, а если нет, то игнорировать.

- я в этом деле новичок и че-то не врубаюсь как так сделать. Может у меня версия ToolSet Старая и нет такого?

Ваще спасибо что не пропустили мимо мой вопрос.

И еще можно вопросик?
Какой скрипт делает завершение игры после выполнения последного задания. Выложите пожалуйста если не лень.
Aiwan
NSS
void main()
{
  string sMovie = "Твой финальный ролик";
  EndGame(sMovie);
}


QUOTE(Dimanische @ Сегодня, 11:51) [snapback]71930[/snapback]
И еще можно вопросик?
Какой скрипт делает завершение игры после выполнения последного задания. Выложите пожалуйста если не лень.

virusman
QUOTE(Aiwan @ Feb 27 2006, 22:09) [snapback]71209[/snapback]

Везде где юзаешь Делей, попробуй сделать так:
NSS
void ActionCreateObject(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag="")
{
  CreateObject(nObjType, sCreature, lLoc, FALSE, sNewTag);
}
void CheckIsHere(object oTarget, string sOrder)
{
    object oSelf = OBJECT_SELF;

    if(GetDistanceBetween(oSelf, oTarget) < 4.0)
    {
        AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0));
        CreateItemOnObject(sOrder, oTarget, 1);
    }
    else
    {
        SpeakString("Куда вы ушли??");
        ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 1.0);
        ActionCreateObject(OBJECT_TYPE_ITEM, sOrder, GetLocation(OBJECT_SELF), TRUE);
    }
    AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf, "vir_waiter_busy", FALSE)));

    //заблокировать и разблокировать очередь
    AssignCommand(oSelf, ActionDoCommand(SetCommandable(TRUE, oSelf)));
    DelayCommand(0.3, SetCommandable(FALSE, oSelf));
}


Тот же результат... Ничего не изменилось.
Lex
а что не так?
virusman
QUOTE(Lex @ Mar 8 2006, 01:35) [snapback]72016[/snapback]

а что не так?

http://www.wrg.ru/forums/index.php?s=&show...indpost&p=71193
Если снять блокировки/разблокировки - всё работает, но тогда официантку легко сбить.
Aiwan
Я же говорил, надо через юзерДеф делать. каждая локалка - блок задач. У тебя не просто задачи, они сложные и просто ей не забъешь стек.

У тебя целый блок AI...

Попробуй так. Этот код верный на 100%. Все на актионах даже локалки в одном блоке. Должна успевать все понимать...
NSS
void ActionCreateObject(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag="")
{
  CreateObject(nObjType, sCreature, lLoc, FALSE, sNewTag);
}
void CheckIsHere(object oTarget, string sOrder)
{
    object oSelf = OBJECT_SELF;

    if(GetDistanceBetween(oSelf, oTarget) < 4.0)
    {
        AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0));
        CreateItemOnObject(sOrder, oTarget, 1);
        // Тут никакой блокировки не надо. Действия простые
    }
    else
    {
        SpeakString("Куда вы ушли??");
        AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 5.0));
        AssignCommand(oSelf, ActionCreateObject(OBJECT_TYPE_ITEM, sOrder, GetLocation(OBJECT_SELF), TRUE));
        AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf, "vir_waiter_busy", FALSE)));
        AssignCommand(oSelf, ActionDoCommand(SetCommandable(TRUE, oSelf)));
        DelayCommand(0.3, SetCommandable(FALSE, oSelf));
    }
}
virusman
CheckIsHere - это только одна из вложенных функций. Она вызывается после того, как официантка дошла до указанной локации:
NSS
void GoToPlayer(object oTarget, string sOrder, float fTimeout)
{
    ActionForceMoveToLocation(GetLocation(oTarget), TRUE, fTimeout);
    ActionDoCommand(SetFacingPoint(GetPosition(oTarget)));
    ActionDoCommand(CheckIsHere(oTarget, sOrder));

    //заблокировать и разблокировать очередь
    DelayCommand(0.2, SetCommandable(FALSE));
    AssignCommand(OBJECT_SELF, ActionDoCommand(SetCommandable(TRUE)));
}

По отдельности эта функция работать будет, но со вложенностью официантка дойдёт до точки, а функция CheckIsHere не выполнится. Там же из main вызывается GiveBottleTo, оттуда - GoToPlayer, а оттуда - уже CheckIsHere.
Ой, блин, не подумал. Может, просто разблокировку сделать перед вызовом функции. smile.gif
З.Ы. Не помогло..
Вишес
Народ, существует ли скрипт, меняющий части тела? И если есть, то какой?
[MoF]Darth_Nick
у ПЦ через лето помойму можно, только не пойму - зачем?
проще целый апиренс изменить
Lex
QUOTE(Вишес @ Mar 11 2006, 08:51) [snapback]72284[/snapback]
Народ, существует ли скрипт, меняющий части тела? И если есть, то какой?

в 1.67 будут такие функции. Сейчас только целиком.
Nuprahtor
Большое спасибо Azathoth`у и Zirrex`у.
Скрипт заработал.

Еще вопрос.
Как сделать, чтобы зомби сначала лежали на земле (Анимация смерти) а потом вставали и дралисьс чаром.
Спасибо за внимание.
StalkerDtN
Nuprahtor, попробуй так:
на зомби на onSpawn
NSS
SetIsDestroyable(FALSE, TRUE, FALSE);
    effect eDeath = EffectDeath();
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);

далее смотря через что, допустим это триггер, тогда на onEnter добавь строчки
NSS
object oDead = GetObjectByTag("ZOMBI");
    effect eRes  = EffectResurrection();
    effect eHeal = EffectHeal(GetMaxHitPoints(oDead));
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eRes, oDead);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oDead);
Артём
Скрипт незнаю но область с зомби которые ожывают могу сделать.
Nuprahtor
Может на OnPerception?
Зомби просто лежат, чар к ним подходит они встают и драка.
[MoF]Darth_Nick
повесь на спаун кат_сцен паралайз или иммобилиз...или и то и то, когда надо удали
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.