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

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

> Вендоры, Как очистить товары вендоров ?
Raven
сообщение Oct 24 2004, 12:19
Сообщение #1


Level 8
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Дарова всем...

Возник трабл - через некоторое время товары вендоров забиваются всяким гэ и сервак начинает жутко лагать... Как можно очистить товары вендоров от вещей игроков ?

Или может ... есть мысля создать вендора "Старьёвщик" - который бы покупал все вещи у игроков, а остальным вендорам запретить покупать вещи. Тогда какой скрипт нада написать, чтобы через некоторое время все товары этого старьёвщика очищались ?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Twin
сообщение Nov 24 2004, 10:35
Сообщение #2


Level 5
**

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



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

Сохраняем под именем "tw_inc_shoplist" следующее:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: Twin
//:: Communication:
//::  E-mail: twin_quad@hotmail.com
//::  IRC: Twin@irc.rinet.ru:6669
//::
//:: Created On: 2004.11.24
//:://////////////////////////////////////////////
//:: Description:
//::  Скрипт в момент продажи игроком в магазин, проверzет,
//::  есть ли уже данный товар в ассортименте. Если есть,
//::  то копиz удалzетсz, а в базе магазина записываетсz,
//::  что данного товара теперь на единицу больше.
//::
//::  В момент покупки из магазина, скрипт создает еще одну
//::  копию купленного предмета, если в базе есть запись о том,
//::  что данный товар не закончилсz.
//:://////////////////////////////////////////////

// Declarations
void SpecSL_Sell();
void SpecSL_Buy();
void SpecSL_UpdateList(object oVendor, object oDisturbedItem, int nSellStack);
void SpecSL_CreateItem(string sResRef, object oVendor, int nStackSize);
string SpecSL_Variable (string sResRef, string sTag);

/*
** Игрок продает товар в магазин.
** Если в магазине данный предмет уже существует и он бесконечен,
** то этот триггер вообще не срабатывает.
*/

void SpecSL_Sell()
{
    object oLostItem = GetModuleItemLost();
    object oNewPosessor = GetItemPossessor(oLostItem);

    if (
        !GetIsObjectValid(oNewPosessor) ||
        GetObjectType(oNewPosessor) != OBJECT_TYPE_STORE ||
        !GetLocalInt(oNewPosessor, "SPECIAL_SHOP_LIST")
    )
        return;

    SpecSL_UpdateList(oNewPosessor, oLostItem, GetNumStackedItems(oLostItem));
}

/*
** Игрок покупает товар в магазине.
** Триггер срабатывае даже если этот предмет бессконечен.
*/

void SpecSL_Buy()
{
    object oLostBy = GetModuleItemAcquiredFrom();

    if (
        !GetIsObjectValid(oLostBy) ||
        GetObjectType(oLostBy) != OBJECT_TYPE_STORE ||
        !GetLocalInt(oLostBy, "SPECIAL_SHOP_LIST")
    )
        return;

    object oLostItem = GetModuleItemAcquired();

    // Флаг длz того чтобы определить купленную в данном магазине вещь,
    // если будут баги в этой системе. После удачного бета-теста нужно удалить.
    //SetLocalInt(oLostItem, "SSL_FLAG", 1);

    SpecSL_UpdateList(oLostBy, oLostItem, 0);
}

string SpecSL_Variable(string sResRef, string sTag)
{
    return "SSL_"+ sResRef +"!"+ sTag;
}

/*
** Удаление всех вещей, эквивалентных проданной/купленной
** и создание единственного экземплzра.
*/

void SpecSL_UpdateList(object oVendor, object oDisturbedItem, int nSellStack)
{
    string sResRef = GetResRef(oDisturbedItem);
    string sTag = GetTag(oDisturbedItem);

    int nCountItems = 0, nStackSize = 1;

    object oItem = GetFirstItemInInventory(oVendor);

    while (GetIsObjectValid(oItem))
    {
        if (
            sResRef == GetResRef(oItem) &&
            sTag == GetTag(oItem)
        ) {
            nCountItems = nCountItems + GetNumStackedItems(oItem);

            // Если игрок продает вещь, то уничтожаем её и все такие же.
            if (nSellStack)
                DestroyObject(oItem);
        }

        oItem = GetNextItemInInventory(oVendor);
    }

    // Это, возможно, бесконечный предмет.
    if (!nSellStack && nCountItems) {
        //SendMessageToPC(GetFirstPC(), "Infinite");
        return;
    }

    nCountItems += GetLocalInt(oVendor, SpecSL_Variable(sResRef, sTag));

    //SendMessageToPC(GetFirstPC(), "NEW nCountItems == "+ IntToString(nCountItems));

    // Берем из 2da размер стеков длz стандартной амуниции к оружию.
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_ARROW)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 20));
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_BOLT)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 25));
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_BULLET)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 27));
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_DART)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 31));
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_SHURIKEN)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 59));
    if (GetBaseItemType(oDisturbedItem) == BASE_ITEM_THROWINGAXE)
        nStackSize = StringToInt(Get2DAString("baseitems", "Stacking", 63));

    if (nStackSize > nCountItems)
        nStackSize = nCountItems;

    //SendMessageToPC(GetFirstPC(), "nStackSize == "+ IntToString(nStackSize));

    nCountItems -= nStackSize;
    if (!nCountItems)
        DeleteLocalInt(oVendor, SpecSL_Variable(sResRef, sTag));
    else
        SetLocalInt(oVendor, SpecSL_Variable(sResRef, sTag), nCountItems);

    //SendMessageToPC(GetFirstPC(), "NEW2 nCountItems == "+ IntToString(nCountItems));

    if (!nStackSize)
        return;

    DelayCommand(0.04f,
        SpecSL_CreateItem(sResRef, oVendor, nStackSize)
    );
}

void SpecSL_CreateItem(string sResRef, object oVendor, int nStackSize)
{
    CreateItemOnObject(sResRef, oVendor, nStackSize);
}

Нужно:
в OnItemAcquire и в OnItemUnAcquire наверху дописать
Neverwinter Script Source
#include "tw_inc_shoplist"

в OnItemAcquire вниз дописать
Neverwinter Script Source
SpecSL_Buy();

в OnItemUnAcquire вниз дописать
Neverwinter Script Source
SpecSL_Sell();

На мерчанта в тулсете нужно вешать LocalInt "SPECIAL_SHOP_LIST" со значением 1.

Также нужно соблюдать следующее условие: нельзя делать в магазине один и тот же предмет несколько раз. Можно сделать 5 бутылок в стеке, но не 5 раз по одной бутылке. Имеется в виду, нельзя этого делать во время создания модуля, т.е. через тулсет. Это вынужденная мера, из-за того что тулсет не даёт возможности определить бесконечен ли данный товар в магазине или нет.

Всё! ;)

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

Сообщение отредактировал Twin - Nov 24 2004, 10:57
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме


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

 



Текстовая версия Сейчас: 26th April 2025 - 22:06