//::////////////////////////////////////////////// //:: 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); } |