//  Function library set to prevent and punish Greater Sanctuary looting
//  Created by AW Olorin 1-11-2004
//  To use these functions in a script on PoA just place the line
//  #include "gsloot_lib"  at the begining of your script.
/*
##  This Library contains 5 functions to prevent people from
##  looting containers while under Greater Sanctuary.
*/

int GS_Check(object oPC, int iFlag = FALSE);
void RogueSpectreSpawn(object oPC);
float GetRandomFloat(float fMinimumTime = 0.4, float MaximumTime = 1.1);
void DropNote(location oLocation);
void DestroyInventory(object oContainer = OBJECT_SELF);

// Check to see if PC is under GS. Returns 1 if true.  If Flag is TRUE
// GS effect will also be removed from player by this function.
// NOTE:  We want DM's and NPC's to do anything they want in GS
// So this function will return FALSE if the object being
// Checked is a DM or NPC even if they ARE under GS
int GS_Check(object oPC, int iFlag = FALSE)
{
   if(GetIsDM(oPC) || (!GetIsPC(oPC)) ) return 0;
   effect eGS_Check = GetFirstEffect(oPC);
   while(GetIsEffectValid(eGS_Check))
      {
         if (GetEffectType(eGS_Check) == EFFECT_TYPE_SANCTUARY)
            {
              if (iFlag)
                 RemoveEffect(oPC,eGS_Check);
              return 1;
            }
         eGS_Check = GetNextEffect(oPC);
      }
   return 0;
}

// will spawn 1 Rogue Spectre per two levels of PC in random points around
// the PC in all direction between 1 and 2 meters away.
void RogueSpectreSpawn(object oPC)
{
   location locSpawn;
   vector vPC = GetPosition(oPC);
   vector vSpectre = vPC;
   int iLoops = (GetHitDice(oPC) / 2);
   int iCounter = 0;

   while(iCounter < iLoops)
     {
        vSpectre.y = vPC.y + GetRandomFloat(0.1,4.0) - 2.0;
        vSpectre.x = vPC.x + GetRandomFloat(0.1,4.0) - 2.0;
        locSpawn = Location(GetArea(oPC),vSpectre,0.0f);
        vSpectre = vPC;
        CreateObject(OBJECT_TYPE_CREATURE,"roguespectre",locSpawn,TRUE);
        iCounter++;
     }
}

// Generates a random float value between fMinimum and fMaximum
float GetRandomFloat(float fMinimum, float Maximum)
{
   float fRandom = Maximum - fMinimum;
   int nRandom;
   if(fRandom < 0.0)
      {
         return 0.0;
      }
   else
      {
         nRandom = FloatToInt(fRandom  * 10.0);
         nRandom = Random(nRandom) + 1;
         fRandom = IntToFloat(nRandom);
         fRandom /= 10.0;
         return fRandom + fMinimum;
      }
}

//  Will drop a note telling player GS looting is bad.
void DropNote(location locLocation)
{
    CreateObject(OBJECT_TYPE_ITEM,"smallnote",locLocation,FALSE);
}

//  Destroys the contents of a container
void DestroyInventory(object oContainer = OBJECT_SELF)
{
    object oInventory;

    if(!GetIsObjectValid(oContainer)) return;
    oInventory = GetFirstItemInInventory(oContainer);
    while(GetIsObjectValid(oInventory))
       {
          DestroyObject(oInventory,0.0f);
          oInventory = GetNextItemInInventory(oContainer);
       }
}