Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 79 80 81 82 83 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Vanes
сообщение Feb 22 2006, 09:28
Сообщение #2001


Level 11
Иконки Групп

Класс: Вор
Характер: Neutral Evil
Раса: Эльф
NWN: Скриптинг [PW]
Validor2



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

Сообщение отредактировал Vanes - Feb 22 2006, 09:30
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 22 2006, 10:21
Сообщение #2002


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



Vanes, а опыт ты как будешь получать за убитое существо? Потом, а вдруг сражающийся персонаж покинет Арену, и что же будут делать остальные игроки? Если все это делать через переключатель, то на него надо вешать переменную, которая будет срабатывать только тогда, когда ты заплатишь за использование Арены. Только вот ведь какая загвоздка, Арена то используется тем игроком, который покинул сервер.

Идея Арены такая, чтобы на ней за раз мог сражаться только один игрок, а остальные просты бы могли подождать.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
[MoF]Darth_Nick
сообщение Feb 22 2006, 10:35
Сообщение #2003


Level 6
Иконки Групп

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить
NWN: Скриптинг [PW]



вешаеш переменую на чара и рычаг(имя_фамилия)
когда чар выходит(exit area), сравниваеш его переменую с переменой рычага
если тру - убиваеш копию

так нельзя чтоле?
запутался что-то

Сообщение отредактировал [MoF]Darth_Nick - Feb 22 2006, 10:36
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
azathoth
сообщение Feb 22 2006, 11:23
Сообщение #2004


Level 12
Иконки Групп

Класс: Оборотень
Характер: Chaotic Neutral
Раса: Нежить
NWN: Скриптинг [Sn]



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;


Если первый зашедший на сервер персонаж не на арене, то скрипт вообще перестанет выполняться.

Сообщение отредактировал azathoth - Feb 22 2006, 11:25
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 22 2006, 13:51
Сообщение #2005


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



azathoth, проверка на тип объекта у меня стоит внутри цикла. Это я в этом примере вынес наружу, чтобы убедиться, что это неверно (IMG:style_emoticons/kolobok_light/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
сообщение Feb 22 2006, 15:38
Сообщение #2006


Level 12
Иконки Групп

Класс: Оборотень
Характер: Chaotic Neutral
Раса: Нежить
NWN: Скриптинг [Sn]



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

Что означает 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))


Сообщение отредактировал azathoth - Feb 22 2006, 15:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 22 2006, 18:31
Сообщение #2007


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



azathoth, спасибо за помощь, но я успел перекроить код и немного его оптимизировать. Вот что получилось. Столько лишнего кода оказалось (IMG:style_emoticons/kolobok_light/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)

войдет на Арену, то появившийся враг тут же пропадет. А если быстро выйдет, до срабатывания хартбита, то враг останется на Арене (IMG:style_emoticons/kolobok_light/smile.gif)

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

Сообщение отредактировал Zirrex - Feb 23 2006, 04:03
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Feb 23 2006, 15:40
Сообщение #2008


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



посмотрел я заметил (как мне кажеться) вот что
- в скрипте не с того угла танцуете (IMG:style_emoticons/kolobok_light/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);
    }
}


Сообщение отредактировал mamuc - Feb 23 2006, 15:46
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
NedWarN
сообщение Feb 23 2006, 22:56
Сообщение #2009


Level 5
**

Класс: Маг
Характер: Lawful Good
Раса: Тварь



Всё Мужики Помираю срочно Хелп.
Вот такая Проблемка.
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
сообщение Feb 23 2006, 23:31
Сообщение #2010


Level 5
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [Sn]



Опиши ситуацию подробнее...у тебя сценка должена запускаться когда босс жив или все же когда погибает.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 24 2006, 00:51
Сообщение #2011


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



mamuc, спасибо, я попробую этот скрипт, только есть несколько но, переменную 'WorkArena' мне нужно изменять только тогда, когда нет игрока, с которого создалась копия, если он вышел с поля Арены или из игры.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Feb 24 2006, 01:31
Сообщение #2012


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Цитата
2. В скрипте Кат Сценки Проверяю на Локалку. И канечно же ничо не Пашит Хелп. плиз.

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

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


Сообщение отредактировал -fenix- - Feb 24 2006, 01:31
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 24 2006, 05:05
Сообщение #2013


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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());
    }
}


Сообщение отредактировал Zirrex - Feb 24 2006, 05:08
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Feb 27 2006, 09:33
Сообщение #2014


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



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

... а оно и меняеться реально только тогда , когда на арене нету игрока..а в остальное время оно FALSE (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Feb 27 2006, 20:37
Сообщение #2015


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Вот кусок скрипта официантки.
Нужно, чтобы она шла так, как нужно, и при этом не зависала и не прерывалась.
Попробовал делать блокировку/разблокировку очереди - официантка подбегает и ничего не делает.
(Скрипт висит на 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)));


Сообщение отредактировал virusman - Feb 27 2006, 20:42
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DEM
сообщение Feb 27 2006, 22:00
Сообщение #2016


Level 7
**

Класс: Маг
Характер: Lawful Neutral
Раса: Эльф



А нельзя сделать что бы она просто шла по вейпоинтам? Например пошла к такому-то вейпоинты, через пять сек к другому и т.д. Или я чего-то не понял...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Feb 27 2006, 22:09
Сообщение #2017


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Везде где юзаешь Делей, попробуй сделать так:
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
сообщение Feb 28 2006, 00:14
Сообщение #2018


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Спасибо, завтра попробую..
Но всё же, как я понимаю, многократная блокировка-разблокировка оставляет возможность (в течение 0.2-0.3 с) сбить работу официантки.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
NedWarN
сообщение Mar 3 2006, 06:34
Сообщение #2019


Level 5
**

Класс: Маг
Характер: Lawful Good
Раса: Тварь



-fenix- Zirrex.
Сорри когда писал немного "Принял" ибо без смазки немагу.
Аба на трезвую голову взглянул и всё заработало гг.
if (!(nDED == 1)) return;
вот так надо! было. хоть бы один сказал. (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Mar 3 2006, 09:51
Сообщение #2020


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



Цитата
if (!(nDED == 1)) return;


а не проще ли if (nDED != 1) return;
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Mar 3 2006, 09:55
Сообщение #2021


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

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

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Mar 3 2006, 10:01
Сообщение #2022


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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

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

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


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

Сообщение отредактировал Zirrex - Mar 3 2006, 10:27
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Mar 3 2006, 10:24
Сообщение #2023


Лорд AxisTown'a
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Дварф
NWN: Маппинг



Цитата
Проще так:

Neverwinter Script Source
if (!nDED) return;

Aiwan это только когда nDED может принять лишь 2 значения(0 и 1 или TRUE/FALSE) ..а если их больше 2 используються, то лучше как мы с Zirrex написали

Сообщение отредактировал mamuc - Mar 3 2006, 10:27
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Mar 3 2006, 10:58
Сообщение #2024


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

Сорри. Я то не глянул, сколько у вас значений (IMG:style_emoticons/kolobok_light/pardon.gif)

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

Там же у Мамука было слово ПРОЩЕ. (IMG:style_emoticons/kolobok_light/pleasantry.gif)

Про НАДЕЖНО никто не говорил. (IMG:style_emoticons/kolobok_light/blum3.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
lowlock
сообщение Mar 5 2006, 06:56
Сообщение #2025


Level 1


Класс: Воин
Характер: Lawful Good
Раса: Человек



Люди, подскажите пожалуйсто. Как мне сделать так, что-бы когда я кольцо одевал сразу появлялся эффект невидимости? или перехода местности
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 79 80 81 82 83 > » 
Ответить в эту темуОткрыть новую тему
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th April 2025 - 07:56