//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, "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, "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////////////////////////////////