Ancordia_PRC8/_module/nss/sfpb_close.nss
Jaysyn904 102ba7dab6 Initial Commit
Initial Commit
2023-09-21 19:51:32 -04:00

163 lines
5.1 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//::///////////////////////////////////////////////
//:: Scarface's Persistent Banking
//:: sfpb_close
//:://////////////////////////////////////////////
/*
Written By Scarface
Modified By AmanShadar
*/
//////////////////////////////////////////////////
#include "sfpb_config"
#include "x4_inc_functions"
void main()
{
// Vars
object oPC = GetLastClosedBy();
object oChest = OBJECT_SELF;
location lLoc = GetLocation(oPC);
string sModName = CharacterDB(oPC);
string sUserID = GetLocalString(oChest, "USER_ID");
int nCount, iCopy;
int iBagID = 1; //start with 1, as 0 comes from lack of variable
object oNewItem;
// Lock the chest
SetLocked(oChest, TRUE);
// First loop to check for containers
// This loop now just counts the items,
// and adds the Bag ID to the bag and items in the bag.
object oItem = GetFirstItemInInventory(oChest);
object oBagItem;
while (GetIsObjectValid(oItem))
{
// Item count
nCount++;
if (GetHasInventory(oItem))
{
//add Bag ID variable to bag and items
SetLocalInt(oItem, "BagID", iBagID);
oBagItem = GetFirstItemInInventory(oItem);
while(GetIsObjectValid(oBagItem))
{
//add Bag ID to item in bag.
SetLocalInt(oBagItem, "BagID", iBagID);
// Item count
oBagItem = GetNextItemInInventory(oItem);
}
iBagID++; //for next bag, if found
//Scarface's original "No Bags" policy, we are going around that.
/*
// Send a message to the player
FloatingTextStringOnCreature("<cø>Containers/bags are NOT allowed to" +
IntToString(MAX_ITEMS) + " be stored!!!" +
"\nPlease remove the container/bag.</c>", oPC);
// Unlock chest and end script
SetLocked(oChest, FALSE);
return;
*/
}
if (nCount > MAX_ITEMS)
{
// Send a message to the player
FloatingTextStringOnCreature("<cø>Only a maximum of " +
IntToString(MAX_ITEMS) + " items are allowed to be stored!!!" +
"\nPlease remove the excess items.</c>", oPC);
// Unlock chest and end script
SetLocked(oChest, FALSE);
return;
}
// Next item
oItem = GetNextItemInInventory(oChest);
}
// Spawn in the NPC storer
object oStorer = CreateObject(OBJECT_TYPE_CREATURE, "sfpb_storage", lLoc, FALSE, sUserID);
// Loop through all items in the chest and copy them into
// the NPC storers inventory and destroy the originals
int iGold = GetGold(oChest);
SetCampaignInt(sModName, "GOLD_IN_LOCKER", iGold);
oItem = GetFirstItemInInventory(oChest);
//First the containers' items get marked to no copy, as they will be when the
//container itself is copied
while(GetIsObjectValid(oItem))
{
if (GetHasInventory(oItem))
{
oBagItem = GetFirstItemInInventory(oItem);
while(GetIsObjectValid(oBagItem))
{
//Mark as copied
SetLocalInt(oBagItem, "copied", 1);
// Next item
oBagItem = GetNextItemInInventory(oItem);
}
}
oItem = GetNextItemInInventory(oChest);
}
oItem = GetFirstItemInInventory(oChest);
//now copy the items
while (GetIsObjectValid(oItem))
{
// This is to stop the duping bug, the dupe bug happened when a player
// would exit the server while still holding a chest open, the reason for
// the duping was the NPC storer would never spawn in this case thus not
// having anywhere to store the items, which ended up the items storing
// back into the chest duplicating itself, now if this happens, the players
// items will not be saved thus avoiding any unwanted item duplicates.
if (!GetIsObjectValid(oStorer))
{
// Delete the local CD Key
DeleteLocalString(oChest, "USER_ID");
// Unlock Chest
SetLocked(oChest, FALSE);
return;
}
// Copy item to the storer
if (GetHasInventory(oItem))
{
oNewItem = CopyObject(oItem, GetLocation(oStorer), oStorer);
}
else
{
iCopy = GetLocalInt(oItem, "copied");
if(iCopy != 1) oNewItem = CopyItem(oItem, oStorer, TRUE);
}
// Destroy Original
DestroyObject(oItem);
//remove the copied variable from the new item.
DeleteLocalInt(oNewItem, "copied");
// Next item
oItem = GetNextItemInInventory(oChest);
}
// Save the NPC storer into the database
StoreCampaignObject(sModName, DATABASE_ITEM + sUserID, oStorer);
// Destroy NPC storer
DestroyObject(oStorer);
// Delete the local CD Key
DeleteLocalString(oChest, "USER_ID");
// Unlock Chest
DelayCommand(5.0, SetLocked(oChest, FALSE));
}