PoA_PRC8/_module/nss/ac_ibag.nss
Jaysyn904 8d97886c3f Changed folder name.
Changed folder name.
2022-10-07 21:08:37 -04:00

307 lines
8.0 KiB
Plaintext
Raw Blame History

//Script Name: ac_ibag
//////////////////////////////////////////
//Created by: Genisys / Guile
//ON: 6/17/08
/////////////////////////////////////////
/* **Notes**
This is the OnActivate Item Script for
the item tagnamed ibag, which will allow
the PC to move undroppable items around
in thier inventory, and it can also
bag all such items as well.
*/
////////////////////////////////////////
//Required Include
#include "x2_inc_switches"
///////////////////////////////////////
//PROTOTYPES DECLARED
int GetNum(object oTarget);
void GiveBack(object oTarget);
void StoreItem(object oStored);
void SortContainer(object oTarget);
void SortBox(object oTarget);
///////////////////////////////////////
//Main Script
void main()
{
// Check if we have the correct event firing the script
if (GetUserDefinedItemEventNumber() != X2_ITEM_EVENT_ACTIVATE) return;
//Major Variables Defined...
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
object oBox = GetObjectByTag("ibagbox");
object oBox2 = GetObjectByTag("ibag2box");
//If the PC Is targeting themself Do this..
if(oTarget==oPC)
{
if(GetLocalInt(GetModule(), "INVUSE")==1)
{
FloatingTextStringOnCreature("This system is busy, try again later", oPC, FALSE);
//Stop the script here!
return;
}
else
{
//This is a fix to Module Event Scripts (Prevents them from firing on PC)
SetLocalInt(GetModule(), "INVUSE", 1);
//Allow the system to be useable again after some time..
DelayCommand(24.1, SetLocalInt(GetModule(), "INVUSE", 0));
}
object oMine = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oMine))
{
//If the item is Undroppable!
if(GetItemCursedFlag(oMine))
{
//Don't take bags!
if(!GetHasInventory(oMine))
{
DelayCommand(1.0, AssignCommand(oBox, ActionTakeItem(oMine, oPC)));
}
}
oMine = GetNextItemInInventory(oPC);
}
//Give the loop time to get all the items!
DelayCommand(6.0, SortBox(oBox));
//Run this again to make sure we get all of the items!
DelayCommand(12.0, SortBox(oBox));
//Run this again to make sure we get all of the items!
DelayCommand(18.0, SortBox(oBox));
//Finally return all items in the box to the PC. (If any remain.)
DelayCommand(24.0, GiveBack(oBox));
}
/////////////////////////////////////////////////////
//CONDITIONALS
//Otherwise if they are not targeting themself, do this..
else
{
//Tell the PC they can only target items..
if(GetObjectType(oTarget)!= OBJECT_TYPE_ITEM)
{
FloatingTextStringOnCreature("You must target an item!", oPC, FALSE);
return;
}
//Tell the PC they must target items in their inventory only!
if(GetItemPossessor(oTarget)!=oPC)
{
FloatingTextStringOnCreature("You must target an item in your inventory!", oPC, FALSE);
return;
}
///////////////////////////////////////////////////////////////////////
//If they have passed the conditionals, let's continue..
//If the pc targets the Special Bag (there are 2 different ones!)
//Then remove it's content and place it in the PC's inventory!
if(GetTag(oTarget)=="ibagboxbag" || GetTag(oTarget)=="plotbag")
{
object oContent = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oContent)==TRUE)
{
//Put the items in the bag in the ibagbox
AssignCommand(oBox, ActionTakeItem(oContent, oTarget));
//Move on to the next item after taking this one.
oContent = GetNextItemInInventory(oTarget);
//While loop end
}
//Return the items!
DelayCommand(1.7, GiveBack(oBox));
//Destroy the bag now..
DelayCommand(2.0, DestroyObject(oTarget,0.0f));
//Stop here
return;
//If statement end
}
//Another Conditional (If they are not targeting a special bag)
//Tell the PC they can't target non-plot containers
if(GetHasInventory(oTarget))
{
FloatingTextStringOnCreature("You must target the Special Items Bag!", oPC, FALSE);
return;
}
//////////////////////////////////////////////////////////////////////////
//If the player is targeting just 1 Undroppable Item
//Let's make sure it's UnDroppable!
if(GetItemCursedFlag(oTarget)==FALSE)
{
//Tell the PC the item must be undroppable & plot!
FloatingTextStringOnCreature("You must target an undroppable item only!", oPC, FALSE);
//Stop the script here!
return;
}
//If they don't have a special bag give them one
if(GetItemPossessedBy(oPC, "itoolbag")==OBJECT_INVALID)
{
CreateItemOnObject("NW_IT_CONTAIN006", oPC, 1, "itoolbag");
}
object oBag = GetItemPossessedBy(oPC, "itoolbag");
//We can't take this plot item, it would present big problems!
if(GetTag(oTarget)=="pcidname")
{
FloatingTextStringOnCreature("This item may not be moved, sorry.", oPC);
return;
}
//Otherise have the storage box take the item.
else
{
//Make the box take the item!
AssignCommand(oBox, ActionTakeItem(oTarget, oPC));
}
//Make the bag unsellable and undroppable!
DelayCommand(0.2, SetItemCursedFlag(oBag, TRUE));
DelayCommand(0.3, SetPlotFlag(oBag, TRUE));
//Give the bag a nice Bright Yellow new name identifying it clearly :)
//Even if it was already set before, because we don't know..
DelayCommand(0.4, SetName(oBag, "<c<><63> >Special Items"));
//Make the ibagbox put the item in the bag!
DelayCommand(0.5, StoreItem(oBox));
//Else statement end
}
//Main Script end
}
/////////////////////////////////////////////////////////////////////
//PROTOTYPE DEFINED
void GiveBack(object oTarget)
{
object oBox = oTarget;
object oPC = GetItemActivator();
object oGiven = GetFirstItemInInventory(oBox);
while(GetIsObjectValid(oGiven)==TRUE)
{
AssignCommand(oBox, ActionGiveItem(oGiven, oPC));
oGiven = GetNextItemInInventory(oBox);
}
}
////////////////////////////////////////////////////////
//PROTOTYPE DEFINED
// Return the number of items oTarget possesses in thier inventory
int GetNum(object oTarget)
{
int nNum = 0;
object oItem = GetFirstItemInInventory(oTarget);
while (GetIsObjectValid(oItem) == TRUE)
{
nNum = nNum +1;
oItem = GetNextItemInInventory(oTarget);
}
return nNum;
//END PROTOTYPE
}
///////////////////////////////////////////////////////
//PROTOTYPE DEFINED
void StoreItem(object oStored)
{
object oBox = oStored;
object oPC = GetItemActivator();
object oGiven = GetFirstItemInInventory(oBox);
while(GetIsObjectValid(oGiven)==TRUE)
{
//Put the item in the bag on the PC!
DelayCommand(0.2, AssignCommand(oBox, ActionGiveItem(oGiven,
GetItemPossessedBy(oPC, "itoolbag"))));
oGiven = GetNextItemInInventory(oBox);
}
}
/////////////////////////////////////////////////
//PROTOTYPE DEFINED
void SortContainer(object oTarget)
{
//Declare Major Variables
object oPC = GetItemActivator();
object oNPC = GetObjectByTag("ibag2box");
object oBox = GetObjectByTag(GetTag(oTarget));
object oMine;
object oBag = GetItemPossessedBy(oNPC, GetTag(oTarget)+ "bag");
//First Put all the items that will fit into the bag
//on the NPC into the bag..
oMine = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oMine)==TRUE)
{
AssignCommand(oTarget, ActionGiveItem(oMine, oBag));
oMine = GetNextItemInInventory(oTarget);
}
//Give the bag a colorful name.. :)
DelayCommand(0.2, SetName(oBag, "<c<><63> >Special Items"));
//Make the bags unsellable and undroppable!!
DelayCommand(0.3, SetItemCursedFlag(oBag, TRUE));
DelayCommand(0.3, SetPlotFlag(oBag, TRUE));
//Give the PC the bag now that it has items in it!
DelayCommand(0.4, AssignCommand(oNPC, ActionGiveItem(oBag, oPC)));
//PROTOTYPE END
}
//////////////////////////////////////////////////
//PROTOTYPE DEFINED
void SortBox(object oTarget)
{
//Declare Major Variables
object oPC = GetLastUsedBy();
object oBox = GetObjectByTag(GetTag(oTarget));
object oItem;
object oNPC = GetObjectByTag("ibag2box");
//We only continue if the box has items!
if(GetNum(oBox)>0)
{
//Give the NPC a Bag to store items in!
//Give the bag the tagname of the box!
CreateItemOnObject("NW_IT_CONTAIN006", oNPC, 1, GetTag(oBox) + "bag");
//Start putting items in the bag on the NPC
DelayCommand(0.3, SortContainer(oTarget));
}
//NOTE: If the box has 0 items, no need to continue!
//PROTOTYPES END
}
/////////////////SCRIPT END////////////////////////////////