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

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

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


Level 5
**

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



Hi All!Сорри давно небыл просто.
Накапилась куча вопросов.
1. Как сделать проверку.
Входиш в локу если в Журнале есть заметка с квестом, то идёт Кат-сценка. если нет то нет.
2. Делаю Непися Невидемым, а снать невидимость некак, я уж и так и сяк. Некак. Делаю его Невидемым через Триггер, и в Идеале бы хотелось снять невидимость в Диалоге.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
[MoF]Darth_Nick
сообщение Feb 21 2006, 06:26
Сообщение #1992


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

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



1. а повесить на чара локалку нельзя?
2. к примеру так...(я вешал сначала инвиз, потом через пару сек убирал его)(если ты конено, о кат сценовом инвизе):

Neverwinter Script Source
RemoveEffect(oPC,GetFirstEffect(oPC));


в других случаях может и не получиться, тогда проверку сделать надо...

Сообщение отредактировал [MoF]Darth_Nick - Feb 21 2006, 09:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Артём
сообщение Feb 21 2006, 10:00
Сообщение #1993


Level 5
**

Класс: Друид
Характер: Neutral Good
Раса: Человек



кто знаит скрипт для поевления текста один рас в день в диологе пожалуйста напишыте или хотябы подскажыте где его можно взять. (IMG:style_emoticons/kolobok_light/unsure.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
mamuc
сообщение Feb 21 2006, 10:10
Сообщение #1994


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

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



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

(IMG:style_emoticons/kolobok_light/mosking.gif) ....мммм Артем возможно вам сначало надо немного освоить правописание, а потом уже заняться работой с тулсетом...
..а сделать то, что вы хотите можно с помощью навешивания локальной переменной(= время, если надо 1 раз в день или что-то типа TRUE\FALSE если надо, что бы это происходило вообще только один раз) на НПСя с которым говорит игрок и проверки значения этой переменной перед началом соотв.ветки диалога

Сообщение отредактировал mamuc - Feb 21 2006, 10:24
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
L33t
сообщение Feb 21 2006, 16:40
Сообщение #1995


Level 2
*

Класс: Вор
Характер: Lawful Evil
Раса: Карлик



Спасибо всем, кто помогал. Я уже решил проблему, все гораздо проще. Вот код:

Neverwinter Script Source
// Автор: L33t
// Модуль: Кривой Долъ
// Описание: Если в радиусе 30 фт от РС есть (полу)эльфы,
//          повесить красное свечение на кинжал, если нет, снять.

int ElvesNearby (object oCenter) // функция проверки эльфов в радиусе 30 фт.
{
    location lTarget = GetLocation (oCenter);
    object oNearby = GetFirstObjectInShape (SHAPE_SPHERE, 30.0, lTarget);
    while (oNearby!=OBJECT_INVALID) {
        if  (GetRacialType(oNearby) == RACIAL_TYPE_ELF)
            return TRUE;
        if  (GetRacialType(oNearby) == RACIAL_TYPE_HALFELF)
            return TRUE;
        oNearby = GetNextObjectInShape (SHAPE_SPHERE, 30.0, lTarget, FALSE);
    } // на первом же найденном остановится
    return FALSE;
}

void main()
{
    object oPC = GetFirstPC();
    object oItem;
    itemproperty ipRedLight = ItemPropertyVisualEffect (ITEM_VISUAL_EVIL);
    itemproperty ipVsElf = ItemPropertyEnhancementBonusVsRace (IP_CONST_RACIALTYPE_ELF,10);
    itemproperty ipVsHalfelf = ItemPropertyEnhancementBonusVsRace (IP_CONST_RACIALTYPE_HALFELF,10);

    while (oPC!=OBJECT_INVALID) {
        oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
        if (GetTag(oItem)=="CD_IT_WBLDAGPG") {
            if (ElvesNearby(oPC)) {
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipRedLight,oItem,6.2f);
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipVsElf,oItem,6.2f);
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipVsHalfelf,oItem,6.2f);
            }
        }
        oPC = GetNextPC();
    }

}


Этот скрипт делает именно то, что мне нужно, а именно:
- если в правой руке игрока находится нужный предмет (тег CD_IT_WBLDAGPG), и рядом есть (полу)эльфы, кинжал светится красным.
- если рядом нет (полу)эльфов, кинжал не светится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
NedWarN
сообщение Feb 21 2006, 17:30
Сообщение #1996


Level 5
**

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



[MoF]Darth_Nick
Я чо такой Душный как кажуся (IMG:style_emoticons/kolobok_light/smile.gif)
Конечно я делал это, но фига. Лаг наверное в том что я Делаю Чара невидемым триггером, а пытаюсь снять в диалоге.
2. Локалка Чото непашит, 100 раз пробовал. (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
azathoth
сообщение Feb 21 2006, 18:07
Сообщение #1997


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

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



поевления текста один рас в день
Neverwinter Script Source
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    int nDay = GetCalendarDay();
    if (GetLocalInt(oPC, "once_a_day_phrase") != nDay)
    {
        SetLocalInt(oPC, "once_a_day_phrase", nDay);
        return TRUE;
    }
    return FALSE;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 21 2006, 22:31
Сообщение #1998


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

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



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

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

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

    string sEnemy, sCreature, sPlayer, sPerson = "";
    object oEnemy, oPC;

    // Поиск первого существа в локации
    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);
    }

    int nCreature = FALSE;

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

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

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

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

        // Если ключ в положении 'FALSE', проверить, кто последний бил существо
        if (!nCreature)
        {
            // Персонаж, который последний ударил
            oPC = GetLastAttacker(oEnemy);
            // Узнать паблик игрока
            sPerson = GetPCPublicCDKey(oPC);
        }

        // Если паблик совпадает с тэгом погибшего существа в первых 8 знаках слева, то продолжить
        if (GetStringLeft(sEnemy, 8) == sPerson)
        {
            // Удостовериться, что уровень персонажа ниже 4-го
            if (GetHitDice(oPC) < 4)
            {
                // Узнать опыт персонажа
                int nXP = GetXP(oPC);
                // Узнать уровень персонажа
                int nLevel = GetHitDice(oPC);
                // Прибавить к уровню 1
                int nHD = nLevel + 1;
                // Вычислить бонусный опыт
                int nMin = (50 * nHD);
                // Выдать бонусный опыт
                SetXP(oPC, nXP + nMin);
            }
            return;
        }
        // Найти следующего персонажа
        oPlayer = GetNextPC();
    }

    // Если ключ в положении 'TRUE', выполнить
    if (nCreature)
    {
        // Поиск первого существа в локации
        object oMonster = GetFirstObjectInArea(OBJECT_SELF);

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

        // Если существо есть, то продолжить
        while (GetIsObjectValid(oMonster))
        {
            // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
            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);
        }
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Feb 22 2006, 00:22
Сообщение #1999


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

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



Zirrex, ты бы описал конкретнее, что ты хочешь сделать. из предыдущих обрывков фраз я, например, ничегошеньки не понял.

прошу пардона, но скрипт запутан, неоптимален и содержит ошибки. (IMG:style_emoticons/kolobok_light/wacko.gif) (IMG:style_emoticons/kolobok_light/unknw.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Feb 22 2006, 03:07
Сообщение #2000


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

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



dumbo, гм, ну что тут не ясного? На Арену входит персонаж, сражается со своей зеркальной копией, а в это время скрипт на хартбите локации постоянно проверяет, совпадают ли паблик персонажа и часть тэга копии персонажа. Если не совпадают, копия персонажа удаляется с Арены.

А проблема, которую я уже описал выше, проста. Когда на Арене больше 1 персонажа, то копия исчезает, потому что ключ 'nCreature' переключается на TRUE, даже если в этот момент на Арене присутствует персонаж, у которого совпадает паблик с тэгом своей копии.

Если уж ошибки в скрипте, то показал бы мне их, а то я с ним уже замучился.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
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
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 30th April 2025 - 11:50