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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Очищение шарда от мусора
Vanes
сообщение Jan 4 2008, 23:32
Сообщение #1


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

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



возможно где-то такое уже предлагалось, но я, честно говоря, такие вещи искать не привык - проще самому написать (IMG:style_emoticons/kolobok_light/smile.gif)

в общем в процессе переписывания старых скриптов под нужны нового модуля обратил внимание на убогость своей системы очищения шарда от ненужного шмота (а вместе с ним и лишних лагов (IMG:style_emoticons/kolobok_light/smile.gif) )...
суть задачи: на шарде по локам появляются вещи (лут из мобов и игроков, просто выкинутые шмотки), которые нужно удалять... у каждой шмотки есть параметр - время через которое она должна быть удалена... нужно написать скрипт и засунуть его в такое место, чтобы результат и время выполнения скрипта были наиболее оптимальными...

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

придумал я вот что...
при создании каждого лутбега или в момент выкидывания игроком шмотки на землю на эти объекты создается своего рода ссылка... а именно - вейпоинты в отдельной локации, на которых хранитятся данные по этому объекту... само собой в локе есть харбит, которые по очереди эти вейпоинты чекает...
т.е. в итоге вместо кучи харбитов получаем один...
с одной стороны, за одним харбитом и следить проще... да к тому же время у меня из внешней бд запрашивается - а одно обращение в 10 сек к БД, это все таки не 100...
с другой, время выполнения скрипта понятно что дольше, да и не понятно вообще насколько все это оптимальней получается (IMG:style_emoticons/kolobok_light/smile.gif)

если кто что может подсказать по сути вопроса - буду рад...
ну или может кто свои системы писал...

собственно скрипты:

процедура, которая создает вейпоинт-ссылку
Neverwinter Script Source

void CreateGarbageLink( object oObject, int nDestroyTime )
{
    object oItem = CreateObject( OBJECT_TYPE_WAYPOINT, GARBAGE_WP, GetLocation( GetObjectByTag( GARBAGE_LOCATION )) );
    SetLocalObject( oObject, "oGarbageLink", oItem );
    SetLocalObject( oItem, "oGarbageItem", oObject );
    if( nDestroyTime>235900 ) nDestroyTime = 235900; // новый день
    SetLocalInt( oItem, "nDestroyTime", nDestroyTime );
}


харбит локи
Neverwinter Script Source

void main( )
{
    int nCurrentTime = GetTime( );
    int nDestroyTime;
    object oGarbageItem;
    int nDebugI = 0;

    object oWP = GetFirstObjectInArea( );
    while( oWP!=OBJECT_INVALID && nDebugI<300 ){
        nDestroyTime = GetLocalInt( oWP, "nDestroyTime" );
        if( nDestroyTime>=0 ){ // если нет переменной nDestroyTime, значит это не GARBAGE_WP
            if( nDebugI>250 ){ // если мусора больше 250 вещей - удаляем все подряд
                oGarbageItem = GetLocalObject( oWP, "oGarbageItem" );           
                DeleteLocalObject( oGarbageItem, "oGarbageLink" );
                DestroyObject( oGarbageItem );
                DeleteLocalObject( oWP, "oGarbageItem" );
                DeleteLocalInt( oWP, "nDestroyTime" );
                DestroyObject( oWP );       
            }else if( nDebugI>150 ){ // если мусора больше 150 вещей - удаляем итемы ( лутпаки не трогаем )
                oGarbageItem = GetLocalObject( oWP, "oGarbageItem" );
                if( GetObjectType( oGarbageItem )==OBJECT_TYPE_ITEM ){
                    DeleteLocalObject( oGarbageItem, "oGarbageLink" );
                    DestroyObject( oGarbageItem );
                    DeleteLocalObject( oWP, "oGarbageItem" );
                    DeleteLocalInt( oWP, "nDestroyTime" );
                    DestroyObject( oWP );                   
                }
            }else if( nDestroyTime<=nCurrentTime ){
                oGarbageItem = GetLocalObject( oWP, "oGarbageItem" );           
                DeleteLocalObject( oGarbageItem, "oGarbageLink" );
                DestroyObject( oGarbageItem );
                DeleteLocalObject( oWP, "oGarbageItem" );
                DeleteLocalInt( oWP, "nDestroyTime" );
                DestroyObject( oWP );
            }
        }
        oWP = GetNextObjectInArea( );
        nDebugI++;
    }
}


скрипт на OnUnacquire модуля
Neverwinter Script Source

void main( )
{
    object oItem = GetModuleItemLost( );
    object oPC = GetModuleItemLostBy( );
    object oNewOwner = GetItemPossessor( oItem );   
   
    // проверяем только вещи игроков + вещь должна быть именно выложена, а не удалена
    if( GetIsPC( oPC ) && oItem!=OBJECT_INVALID && oNewOwner==OBJECT_INVALID ){
        int nCurrentTime = GetTime( );
        CreateGarbageLink( oItem, nCurrentTime+GARBAGE_DESTROY_DELAY );       
    }
}


скрипт на Acquire модуля (ну и по сути теже команды выполняются на скрипте OnDisturb лутбега, когда из него вытаскивают последнюю шмотку)
Neverwinter Script Source

void main( )
{
    object oItem = GetModuleItemAcquired( );

    object oGarbageLink = GetLocalObject( oItem, "oGarbageLink" );
    if( oGarbageLink!=OBJECT_INVALID ){
        DeleteLocalObject( oItem, "oGarbageLink" );
        DeleteLocalObject( oGarbageLink, "oGarbageItem" );
        DeleteLocalInt( oGarbageLink, "nDestroyTime" );
        DestroyObject( oGarbageLink );                   
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Existor
сообщение Jan 5 2008, 18:31
Сообщение #2


Level 6
**

Класс: Разведчик Арфистов
Характер: True Neutral
Раса: Животное



НвН1: 3 минуты - в полевых условиях полет нормальный. А больше, имхо, смысла и нет откладывать. Игрокам хватит 3 минуты времени, чтобы понять, нужно ли им содержимое лутбэга.
Если речь идет про дроп с игрока при смерти - так он пропадать не должен вообще. Если игрок дропнул вещь - бывает, но обычно не напрягает(тоесть сознательным завалом локаций дропом обычно никто не занимается, да и не так это страшно во всех возможных смыслах). Основной мусор создается дропом с мобов, а вот с ним задерженный дестрой контейнера справляется на ура.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме
- Vanes   Очищение шарда от мусора   Jan 4 2008, 23:32
- - Lex   Цитата(Vanes @ Jan 4 2008, 23:32) придума...   Jan 5 2008, 00:15
- - Vanes   использование локи (как вариант еще был инвентарь ...   Jan 5 2008, 00:44
- - Edwin   Я не видел нвн 2-3 года, предупреждаю. Но как мне...   Jan 5 2008, 03:45
- - Vanes   ЦитатаСоздаем очередь типа FIFO через simply linke...   Jan 5 2008, 04:10
- - Edwin   QUOTEвопрос - чем это реализовывать в тулсете ??? ...   Jan 5 2008, 04:37
- - dumbo   Vanes, объекты вешай на локу, при входе первого PC...   Jan 5 2008, 05:12
- - Vanes   ЦитатаНе думаю что это займет очень много места в ...   Jan 5 2008, 05:58
- - Edwin   QUOTEне думаю что это реально организовать силами ...   Jan 5 2008, 06:43
|- - virusman   Цитата(Edwin @ Jan 5 2008, 06:43) Если ты...   Jan 5 2008, 12:19
- - azathoth   тупо, просто, быстро: лист (приорити если важно вр...   Jan 5 2008, 10:37
- - Edwin   Херово, разработчики угробили потенциал ООП. Кто ж...   Jan 5 2008, 12:59
|- - virusman   Цитата(Edwin @ Jan 5 2008, 12:59) Херово,...   Jan 5 2008, 13:18
- - Existor   Цитата(Vanes @ Jan 4 2008, 23:32) придума...   Jan 5 2008, 15:25
- - Vanes   ЦитатаА что, если при создании каждого конкретного...   Jan 5 2008, 15:47
- - Existor   Цитата(Vanes @ Jan 5 2008, 15:47) не дела...   Jan 5 2008, 15:55
- - Lex   Цитата(Existor @ Jan 5 2008, 15:25) А что...   Jan 5 2008, 16:17
- - Vanes   я про ситуацию, когда шмотку выкинули, мы на нее п...   Jan 5 2008, 17:09
|- - virusman   Цитата(Vanes @ Jan 5 2008, 17:09) я про с...   Jan 5 2008, 17:39
- - Lex   так это.. вешай не на шмотку, а на контейнер. Ты ж...   Jan 5 2008, 17:40
- - Vanes   ну по сути понятно... осталось убедиться, что Dela...   Jan 5 2008, 17:56
- - Existor   НвН1: 3 минуты - в полевых условиях полет нормальн...   Jan 5 2008, 18:31


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

 



Текстовая версия Сейчас: 6th May 2024 - 22:55