That’s a very good point …
I think this is the case.
It depends how long someone has spent trying to help I suppose … but I think I would at least try to give some feedback to encourage those who have made the effort for the OP. But maybe that’s just me?
Anyway, here is a version that works in a similar fashion to NWShacker. I intend to work on it a bit more, as I am going to try to have it accommodate other variations that my previous script included, but I did say I would post some of the next bit of work …
NB: This version currently does not allow multiple items across a random set, as my previous script does. I may look at adding that later.
//////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION: ITEMS RANDOMLY PLACED IN PLACEABLES BY LANCE BOTELLE (BASED ON NWShacker APPROACH)
//////////////////////////////////////////////////////////////////////////////////////////////
// EXAMPLE USAGE: PLACE THIS SCRIPT ON A TRIGGER WITH VARIABLE STRUCTURE AS FOLLOWS:-
// 1) A STRING VARIABLE CALLED "PLACETAG" WITH THE TAG OF THE PLACEABLE BEING USED FOR RANDOM FIND.
// 2) AN INTEGER VARIABLE CALLED "QUANTITY" WITH THE TOTAL NUMBER OF ITEMS TO FIND IN THE SET = X.
// 3) STRING VARIABLES IN FORMAT "RR1" CONTAINING RESREF OF OBJECT(S) TO CREATE. (TO BE UPDATED.)
//////////////////////////////////////////////////////////////////////////////////////////////
void CreateItemsInPlaceable(string sPlaceTag, string sItemResRef, int iItemCount, int iStackSize=1, string sNewTag="");
void CreateItemsInPlaceable(string sPlaceTag, string sItemResRef, int iItemCount, int iStackSize=1, string sNewTag="")
{
//////////////////////////////////////////////////////////////////////////////////
// COUNT PLACEABLES USED & STORE TEMPORARY VERSION OF SELF ON SELF (TO ALLOW SWAP)
//////////////////////////////////////////////////////////////////////////////////
// INITIALIZE
int iCount = 0;
object oPlaceable = GetObjectByTag(sPlaceTag, iCount);
while(oPlaceable != OBJECT_INVALID)
{
SetLocalObject(oPlaceable, sItemResRef, oPlaceable);
iCount = iCount + 1;
oPlaceable = GetObjectByTag(sPlaceTag, iCount);
}
// THE PLACEABLE COUNT
int iPlaceableCount = iCount;
//////////////////////////////////////////////////////////////////////////////////
// DEBUG CHECKS
//////////////////////////////////////////////////////////////////////////////////
if(iPlaceableCount < 1 || iItemCount == 0 || sItemResRef == "" || iItemCount > iPlaceableCount)
{
SendMessageToPC(GetFirstPC(), "<<< A MISSING PARAMETER OR ERROR IN FUNCTION USAGE >>>");
return;
}
//////////////////////////////////////////////////////////////////////////////////
// NOW SHUFFLE THE CHEST COPIES STORED ON THEMSELVES AMONG THEMSELVES (COUNTED)
// THIS KEEPS SWITCHING THE STORED COPIES AROUND FOR AS MANY COUNTED
//////////////////////////////////////////////////////////////////////////////////
iCount = 0;
while(iCount < iPlaceableCount)
{
// GET THE CHEST ACCORDING TO ITS LOCATION
object oChestToUpdate = GetObjectByTag(sPlaceTag, iCount);
object oChestToSwap = GetObjectByTag(sPlaceTag, Random(iPlaceableCount));
// RETRIEVE ITS CURRENTLY ASSOCIATED CHEST
object oFromUpdate = GetLocalObject(oChestToUpdate, sItemResRef);
object oFromSwap = GetLocalObject(oChestToSwap, sItemResRef);
// AND SWAP THEM!
SetLocalObject(oChestToUpdate, sItemResRef, oFromSwap);
SetLocalObject(oChestToSwap, sItemResRef, oFromUpdate);
iCount = iCount + 1;
}
//////////////////////////////////////////////////////////////////////////////////
// NOW RETRIEVE THE SHUFFLED OBJECT ON PLACEABLE & CREATE ITEM ON IT
//////////////////////////////////////////////////////////////////////////////////
iCount = 0;
while(iCount < iItemCount)
{
// JUST GET THE CHESTS
object oChest = GetObjectByTag(sPlaceTag, iCount);
// BUT RETRIEVE THE "OBJECT" CHEST TO USE FROM THEM
oChest = GetLocalObject(oChest, sItemResRef);
CreateItemOnObject(sItemResRef, oChest, iStackSize, sNewTag);
// DEBUG FEEDBACK
//SendMessageToPC(GetFirstPC(), ">>> CREATING: " + sItemResRef + " ON " + GetTag(oChest));
iCount = iCount + 1;
}
}
void main()
{
// WAIT UNTIL WE HAVE A VALID PC IN THE GAME FOR FEEDBACK (IN CASE CREATURE TRIGGERS)
object oPC = GetFirstPC(); if(oPC == OBJECT_INVALID){return;}
// RETRIEVE THE VARIABLES WHICHEVER WAY YOU WANT TO
// BUT HERE IS AN EXAMPLE WITH DATA PROVIDED
string sPlaceTag = "TestChest"; // ENSURE ALL PLACEABLES REQUIRED HAVE TAG "Chest"
int iItemCount = 4; // NUMBER OF ITEMS ACROSS THE DROP
string sItemResRef = "nw_it_mpotion021"; // THE ITEM RES REF TO BE DROPPED
// MY TEST TRIGGER WITH ITS VARIABLES
//object oTrigger = OBJECT_SELF;
// GATHER INFO FROM THE TRIGGER VARS
//sPlaceTag = GetLocalString(oTrigger, "PLACETAG");
//iItemCount = GetLocalInt(oTrigger, "QUANTITY");
//sItemResRef = GetLocalString(oTrigger, "RR1");
CreateItemsInPlaceable(sPlaceTag, sItemResRef, iItemCount);
}
SCRIPT UPDATED
Here is an improved version (supporting multiple items), which I have also posted afresh below …
//////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION: ITEMS RANDOMLY PLACED IN PLACEABLES BY LANCE BOTELLE (BASED ON NWShacker APPROACH)
//////////////////////////////////////////////////////////////////////////////////////////////
// EXAMPLE USAGE: PLACE THIS SCRIPT ON A TRIGGER WITH VARIABLE STRUCTURE AS FOLLOWS:-
// 1) A STRING VARIABLE CALLED "PLACETAG" WITH THE TAG OF THE PLACEABLE BEING USED FOR RANDOM FIND.
// 2) AN INTEGER VARIABLE CALLED "QUANTITY" WITH THE TOTAL NUMBER OF ITEMS TO FIND IN THE SET = X.
// 3) STRING VARIABLES IN FORMAT "RR1" CONTAINING RESREF OF OBJECT(S) TO CREATE. (OPTIONAL NEXT)
// 3a) Multiple items (up to 5 max) can be checked in a set if added via sRR2, sRR3, sRR4 and sRR5
// NB: If 3a is used, make sure iItemCount matches the number of different items to be created,
// OR item defined by sRR1 will be created in all remaining situations.
//////////////////////////////////////////////////////////////////////////////////////////////
void CreateItemsInPlaceable(string sPlaceTag, int iItemCount, string sRR1, string sRR2="", string sRR3="", string sRR4="", string sRR5="", int iStackSize=1, string sNewTag="");
void CreateItemsInPlaceable(string sPlaceTag, int iItemCount, string sRR1, string sRR2="", string sRR3="", string sRR4="", string sRR5="", int iStackSize=1, string sNewTag="")
{
//////////////////////////////////////////////////////////////////////////////////
// COUNT PLACEABLES USED & STORE TEMPORARY VERSION OF SELF ON SELF (TO ALLOW SWAP)
//////////////////////////////////////////////////////////////////////////////////
string sVariable = "PlaceObject";
// INITIALIZE
int iCount = 0;
object oPlaceable = GetObjectByTag(sPlaceTag, iCount);
while(oPlaceable != OBJECT_INVALID)
{
SetLocalObject(oPlaceable, sVariable, oPlaceable);
iCount = iCount + 1;
oPlaceable = GetObjectByTag(sPlaceTag, iCount);
}
// THE PLACEABLE COUNT
int iPlaceableCount = iCount;
//////////////////////////////////////////////////////////////////////////////////
// DEBUG CHECKS
//////////////////////////////////////////////////////////////////////////////////
if(iPlaceableCount < 1 || iItemCount == 0 || sRR1 == "" || iItemCount > iPlaceableCount)
{
SendMessageToPC(GetFirstPC(), "<<< A MISSING PARAMETER OR ERROR IN FUNCTION USAGE >>>");
return;
}
//////////////////////////////////////////////////////////////////////////////////
// NOW SHUFFLE THE CHEST COPIES STORED ON THEMSELVES AMONG THEMSELVES (COUNTED)
// THIS KEEPS SWITCHING THE STORED COPIES AROUND FOR AS MANY COUNTED
//////////////////////////////////////////////////////////////////////////////////
iCount = 0;
while(iCount < iPlaceableCount)
{
// GET THE CHEST ACCORDING TO ITS LOCATION
object oChestToUpdate = GetObjectByTag(sPlaceTag, iCount);
object oChestToSwap = GetObjectByTag(sPlaceTag, Random(iPlaceableCount));
// RETRIEVE ITS CURRENTLY ASSOCIATED CHEST
object oFromUpdate = GetLocalObject(oChestToUpdate, sVariable);
object oFromSwap = GetLocalObject(oChestToSwap, sVariable);
// AND SWAP THEM!
SetLocalObject(oChestToUpdate, sVariable, oFromSwap);
SetLocalObject(oChestToSwap, sVariable, oFromUpdate);
iCount = iCount + 1;
}
//////////////////////////////////////////////////////////////////////////////////
// NOW RETRIEVE THE SHUFFLED OBJECT ON PLACEABLE & CREATE ITEM ON IT
//////////////////////////////////////////////////////////////////////////////////
iCount = 0;
while(iCount < iItemCount)
{
// JUST GET THE CHESTS
object oChest = GetObjectByTag(sPlaceTag, iCount);
// BUT RETRIEVE THE "OBJECT" CHEST TO USE FROM THEM
oChest = GetLocalObject(oChest, sVariable);
// MULTIPLE ITEM INTERCEPT (CURRENTLY UP TO FIVE ITEMS POSSIBLE)
if(iCount == 1 && sRR2 != ""){sRR1 = sRR2;}
else if(iCount == 2 && sRR3 != ""){sRR1 = sRR3;}
else if(iCount == 3 && sRR4 != ""){sRR1 = sRR4;}
else if(iCount == 4 && sRR5 != ""){sRR1 = sRR5;}
// NOW CREATE THE ITEM REQUIRED
CreateItemOnObject(sRR1, oChest, iStackSize, sNewTag);
// DEBUG FEEDBACK
//SendMessageToPC(GetFirstPC(), ">>> CREATING: " + sRR1 + " ON " + GetTag(oChest));
iCount = iCount + 1;
}
}
void main()
{
// WAIT UNTIL WE HAVE A VALID PC IN THE GAME FOR FEEDBACK (IN CASE CREATURE TRIGGERS)
object oPC = GetFirstPC(); if(oPC == OBJECT_INVALID){return;}
// RETRIEVE THE VARIABLES WHICHEVER WAY YOU WANT TO
// BUT HERE IS AN EXAMPLE WITH DATA PROVIDED
string sPlaceTag = "TestChest"; // ENSURE ALL PLACEABLES REQUIRED HAVE TAG "Chest"
int iItemCount = 4; // NUMBER OF ITEMS ACROSS THE DROP
string sRR1 = "nw_it_mpotion021"; // THE ITEM RES REF TO BE DROPPED
string sRR2 = "";
string sRR3 = "";
string sRR4 = "";
string sRR5 = "";
int iStack = 1;
string sNewTag = "";
// MY TEST TRIGGER WITH ITS VARIABLES
/*object oTrigger = OBJECT_SELF;
// GATHER INFO FROM THE TRIGGER VARS (NEW STACK & TAG WOULD BE HERE TOO)
sPlaceTag = GetLocalString(oTrigger, "PLACETAG");
iItemCount = GetLocalInt(oTrigger, "QUANTITY");
sRR1 = GetLocalString(oTrigger, "RR1");
sRR2 = GetLocalString(oTrigger, "RR2");
sRR3 = GetLocalString(oTrigger, "RR3");
sRR4 = GetLocalString(oTrigger, "RR4");
sRR5 = GetLocalString(oTrigger, "RR5");
*/
CreateItemsInPlaceable(sPlaceTag, iItemCount, sRR1, sRR2, sRR3, sRR4, sRR5, iStack, sNewTag);
}