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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
 
Ответить в эту темуОткрыть новую тему
> Бесконечный цикл
virusman
сообщение Jan 2 2005, 20:03
Сообщение #1


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

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



Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
                }
            }

Выполнение этого куска скрипта приводит к многократному созданию плейсебла в одной точке + подвисанию и таймауту скрипта. ГДЕ здесь бесконечный цикл создания объекта?! :swoon:

Сообщение отредактировал virusman - Jan 2 2005, 21:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lukas Addon
сообщение Jan 2 2005, 20:42
Сообщение #2


Level 2
*

Класс: Волшебник
Характер: True Neutral
Раса: Эльф



Возможно надо сделать так чтобы этот скрипт выполнялся 1 раз
то есть добавить переменную

Сообщение отредактировал Lukas Addon - Jan 2 2005, 21:12
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 2 2005, 21:15
Сообщение #3


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



ВИРЬ, ну ты даешь!!

Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                }
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
            }


надеюсь, объяснять не надо, почему так, а не так, как ты написал? (примерно неделю назад ТОЧНО ТАКОЙ ЖЕ случай зацикливания кто-то выложил. Я там расписал, почему так, а не иначе. )
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
2GoDoom
сообщение Jan 2 2005, 21:17
Сообщение #4


Level 11
***

Класс: Обыватель
Характер: True Neutral
Раса: Человек
NWN: Маппинг



И что не понятного?
пока oTemp = GetFirstObjectInArea(OBJECT_SELF); - будет "совпадать" - будет выполняться условие...
может стоит сделать for (правда не помню я - есть ли он в НВНе) =)
Ну или в While вписать другие условия...

А вообще - что требуется от скрипта?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 2 2005, 21:24
Сообщение #5


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

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



Брр. Опять не тот исходник выложил.
У меня и:
Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                }
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
            }

Действовал абсолютно аналогично.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 2 2005, 21:28
Сообщение #6


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Эх..ладно, что-то меня совесть замучила. Сейчас объясню для тех, кто не понял еще раз и тему закрою. (Твин, можно это в ФАК занести потом будет)

Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
                }
            }

Идея скрипта такова: замещение одного объекта другим. Те цикл, который перебирает все объекты локации, и если тэг объекта совпадает с тэгом заменяемого объекта (тут это "vir_dw_snow") то мы создаем новый объект, а старый удаляем.

А теперь что НА САМОМ деле тут происходит.
Первый же объект в локации, который будет иметь тэг не "vir_dw_snow" повесит скрипт. ТАК КАК ПЕРЕОБОЗНАЧЕНИЕ ПЕРЕМЕННОЙ oTemp ПРОИСХОДИТ ВНУТРИ УСЛОВИЯ ПРОВЕРКИ ТЭГА. Другими словами, если тэг не "vir_dw_snow" то этот объект и будет вечно бегать по циклу, другой не берется.

Что делать?
Правильно, перенести переобозначение объекта (oTemp = GetNextObjectInArea(OBJECT_SELF);) в тело цикла. Те получаем вот это:
Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                }
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
            }

Добавлено в [mergetime]1104690570[/mergetime]
Вирь, да не может такого быть. У меня такие скрипты работают как часы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 2 2005, 21:37
Сообщение #7


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

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



Да я знаю, в чем баг скрипта, который в первом посте. Это я просто криво его восстановил после различных безуспешных попыток что-то другое намудрить. Первоначальный вариант был как у тебя. И он виснет. :swoon:

Сообщение отредактировал virusman - Jan 2 2005, 21:40
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Comper
сообщение Jan 2 2005, 22:24
Сообщение #8


Level 2
*

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить



Такая же проблема и у меня сегодня возникла. Но я только создаю объекты в таком цикле.
Причина возможно кроется в том что, в цикле по всем объекта в локе нельзя создавать и, возможно, удалять объекты, находящиеся в этой же локе. Похоже меняются указатели на след. объект.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 2 2005, 22:31
Сообщение #9


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



я писал скрипты отчистки локации от мусора. Все работает. А это удаление объектов в цикле.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 2 2005, 22:33
Сообщение #10


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

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



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

Я пробовал так:

Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                    oTemp = GetFirstObjectInArea(OBJECT_SELF);
                }
                else
                {
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
                }
            }

Результат: игра уже не виснет, но при каждом вызове создается куча плейсеблов в одной точке, после чего скрипт вылетает с таймаутом (при след. вызове скрипт все-таки переходит на другую точку).
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 2 2005, 22:35
Сообщение #11


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                    oTemp = GetFirstObjectInArea(OBJECT_SELF);
                    // может сюда надо oTemp = GetNextObjectInArea(OBJECT_SELF); :)
                }
                else
                {
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
                }
            }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 2 2005, 22:35
Сообщение #12


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

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



QUOTE
я писал скрипты отчистки локации от мусора. Все работает. А это удаление объектов в цикле.

Да у меня тоже.. Даже отложенные вызовы и вложенные циклы в некоторых местах применялись. Но именно в этом скрипте почему-то все виснет. Может, потому что он висит на heartbeat локации? Я с этим уже не в первый раз сталкиваюсь: чуть раньше у меня один модуль вообще вызывал синий экран и зависание всего компа, когда heartbeat локации посылал команды NPC.

Сообщение отредактировал virusman - Jan 2 2005, 22:37
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 2 2005, 22:43
Сообщение #13


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

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



QUOTE (Lex @ Jan 2 2005, 22:35)
Neverwinter Script Source
oTemp = GetFirstObjectInArea(OBJECT_SELF);
            while(GetIsObjectValid(oTemp))
            {
                if(GetTag(oTemp)=="vir_dw_snow")
                {
                    CreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", GetLocation(oTemp));
                    DestroyObject(oTemp);
                    oTemp = GetFirstObjectInArea(OBJECT_SELF);
                    // может сюда надо oTemp = GetNextObjectInArea(OBJECT_SELF); :)
                }
                else
                {
                    oTemp = GetNextObjectInArea(OBJECT_SELF);
                }
            }

Результат тот же. Виснет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Comper
сообщение Jan 2 2005, 23:33
Сообщение #14


Level 2
*

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить



Neverwinter Script Source
string sName, sTag;
int nNum = 0;

object oTemp = GetFirstObjectInArea(OBJECT_SELF);
while (oTemp != OBJECT_INVALID)
{
    sName = GetName(oTemp);
    if (GetStringLeft(sName, 2) == "SP")
    {
        nNum++;
        SetLocalObject(OBJECT_SELF,"SP"+IntToString(nNum),oTemp);
    }
    oTemp = GetNextObjectInArea(OBJECT_SELF);
}

int i;
for (i=1; i <= nNum; i++)
{
    oTemp = GetLocalObject(OBJECT_SELF, "SP"+IntToString(i));
    if (oTemp != OBJECT_INVALID)
    {
        CreateObject(OBJECT_TYPE_CREATURE, GetTag(oTemp), GetLocation(oTemp), FALSE, GetTag(oTemp));
    }
}

Сделал в 2 этапа. Первый цикл проходит, но при включении 2го - повисание. Этот скрипт висит на OnEnter локи. Или у меня во втором цикле ошибка?

Сообщение отредактировал Comper - Jan 2 2005, 23:34
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 2 2005, 23:36
Сообщение #15


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



я не работаю с for в скриптах почти никогда.
i=1;
while (i<=nNum)
{
....
i++;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Comper
сообщение Jan 2 2005, 23:43
Сообщение #16


Level 2
*

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить



Эффект тот же.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jan 3 2005, 00:02
Сообщение #17


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

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



Кстати, юзайте Script Debugger. :) Завтра гляну, что он напишет про мой скрипт.

Сообщение отредактировал virusman - Jan 3 2005, 00:03
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 3 2005, 00:09
Сообщение #18


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



что за дебагер?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Twin
сообщение Jan 3 2005, 10:36
Сообщение #19


Level 5
**

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



Вариант рабочий:
Neverwinter Script Source
void main()
{
    int nCount = 0;
    location lTemp;

    object oTemp = GetFirstObjectInArea(GetObjectByTag("AREA001"));

    while ( GetIsObjectValid(oTemp) ) {
        if ( GetTag(oTemp) == "StatueDefaced" ) {
            SetLocalLocation(OBJECT_SELF,
                "TEMP_CreDelItems_"+ IntToString(nCount), GetLocation(oTemp)
            );
            nCount++;

            DestroyObject(oTemp);
        }

        oTemp = GetNextObjectInArea(GetObjectByTag("AREA001"));
    }

    for ( ; nCount >= 0; nCount-- ) {
        lTemp = GetLocalLocation(OBJECT_SELF,
            "TEMP_CreDelItems_"+ IntToString(nCount)
        );
        DeleteLocalLocation(OBJECT_SELF,
            "TEMP_CreDelItems_"+ IntToString(nCount)
        );

        CreateObject(OBJECT_TYPE_PLACEABLE, "plc_impledcrpse1", lTemp);
    }
}

OBJECT_SELF - в данном случае это модуль.

Остается только проблема с созданием новых плейсов на месте старых статичных. Статичеые плейсы не удаляются и в _первом_ цикле участвуют (но потом куда-то из цикла пропадают, странно :xz:). В общем, если девелоппер гарантирует, что все плейсы, заменяемые в цикле будут не статичными, то всё окей. Имхо. :yes:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DBColl
сообщение Jan 3 2005, 11:54
Сообщение #20


4-х Кубовый
Иконки Групп

Класс: Некромант
Характер: Lawful Evil
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



Да, Твин верно заметил, что для уничтожаемых плэйсов надо ОБЯЗАТЕЛЬНО снимать галку Static. Не забывайте!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Vanes
сообщение Jan 3 2005, 14:07
Сообщение #21


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

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



Neverwinter Script Source
void VoidCreateObject(int nType, string sResRef, location lLoc)
{
    CreateObject(nType, sResRef, lLoc);
}

void main()
{
    object oTemp = GetFirstObjectInArea(OBJECT_SELF);
    location lLoc;
    while(GetIsObjectValid(oTemp))
    {
        if(GetTag(oTemp)=="vir_dw_snow")
        {
            lLoc = GetLocation(oTemp);
            ActionDoCommand(DestroyObject(oTemp)); // вот так правильнее ;)
            ActionDoCommand(VoidCreateObject(OBJECT_TYPE_PLACEABLE, "x0_snowdrift", lLoc));
        }
        oTemp = GetNextObjectInArea(OBJECT_SELF);
    }
}

вот это должно работать...

DBColl: Чуток исправлю...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 16th April 2024 - 11:49