FANDOM



Small Resting Script Edit

formerly boz_oX_resting


What it does Edit

This is a small resting script that only uses the onRest module event for easy implementation in an existing module. It allows the players to rest after a specified amount of hours has passed and no hostile creatures are nearby.


Notes Edit

This script is the "updated" version of the one I posted two weeks ago in the old thread. I've taken out the requirement of a bedroll so that the only modification of a module to use this script is the onRest event of the module (no custom items, placeables etc.) If you still want bedrolls or resting through the use of placeables (like beds) or a campfire requirement... Take a look at the "Big Resting Script": http://www.boz-base.com/nwn/index.html

The script Edit

//:://////////
//:: Basic Resting Script v1.0
//:: boz_onrest_v10.nss
//:: Copyright (c) 2002 Brotherhood of Zock
//:://////////
/*
   This script allows the players to rest after a specified amount of hours
   has passed and no hostile creatures are nearby.
   Notes:
   It only affects Player Characters. Familiars, summoned creatures and probably henchmen WILL rest!
   Installation:
   Place this script in the module onRest event.
*/
//:://////////
//:: Created By: Timo "Lord Gsox" Bischoff (NWN Nick: Kihon)
//:: Created On: August 04, 2002
//:://////////

//:://////////
//:: GetHourTimeZero
//:: Copyright (c) 2002 BrotherhoodofZock
//:://////////
/*
   modified July 30, 2002
   iHourTimeZero calculation modified. iYear-1 replaced by iYear.
   In NWN the Year-count starts with 0 (though year 0 doesn't make much sense).
   Think of year 0 as the first year (Year 1).
*/
//:://////////
//:: Created By: Timo "Lord Gsox" Bischoff (NWN Nick: Kihon)
//:: Created On: July 07, 2002
//:://////////
// Counting the actual date from Year0 Month0 Day0 Hour0 in hours
int GetHourTimeZero(int iYear = 99999, int iMonth = 99, int iDay = 99, int iHour = 99)
{
  // Check if a specific Date/Time is forwarded to the function.
  // If no or invalid values are forwarded to the function, the current Date/Time will be used
  if (iYear > 30000)
    iYear = GetCalendarYear();
  if (iMonth > 12)
    iMonth = GetCalendarMonth();
  if (iDay > 28)
    iDay = GetCalendarDay();
  if (iHour > 23)
    iHour = GetTimeHour();
  //Calculate and return the "HourTimeZero"-TimeIndex
  int iHourTimeZero = (iYear)*12*28*24 + (iMonth-1)*28*24 + (iDay-1)*24 + iHour;
  return iHourTimeZero;
}

//:://////////
//:: Main Function
//:: Copyright (c) 2002 Brotherhood of Zock
//:://////////
/*
   The Main Function of the resting script.
*/
//:://////////
//:: Created By: Timo "Lord Gsox" Bischoff (NWN Nick: Kihon)
//:: Created On: August 04, 2002
//:://////////
// The main function placed in the onRest event
void main()
{
  object oPC = GetLastPCRested(); // This Script only affects Player Characters. Familiars, summoned creatures and probably henchmen WILL rest!
  int iRestDelay = 8;       // The ammount of hours a player must wait between Rests (Default = 8 hours)
  int iHostileRange = 30;   // The radius around the players that must be free of hostiles in order to rest.
                            // iHostileRange = 0: Hostile Check disabled
                            // iHostileRange = x; Radius of Hostile Check (x meters)
                            // This can be abused as some sort of "monster radar".
  // ---------- Rest Event started ----------
  if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
  {
    // Check if since the last rest more than <iRestDelay> hours have passed.
    if (GetHourTimeZero() < GetLocalInt (oPC, "i_TI_LastRest") + iRestDelay) // i_TI_LastRest is 0 when the player enters the module
    {    // Resting IS NOT allowed
      AssignCommand (oPC, ClearAllActions()); // Prevent Resting
      SendMessageToPC (oPC, "You must wait " + IntToString (iRestDelay - (GetHourTimeZero() - GetLocalInt (oPC, "i_TI_LastRest"))) + " hour(s) before resting again.");
    }
    else // Resting IS possible
    {
      object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
      if (iHostileRange == 0 || (iHostileRange != 0 && GetDistanceToObject(oCreature) <= IntToFloat(iHostileRange)))
      { // If Hostile Check disabled or no Hostiles within Hostile Radius: Initiate Resting
        object oRestbedroll = CreateObject (OBJECT_TYPE_PLACEABLE, "plc_bedrolls", GetLocation (oPC), FALSE); // Place a static bedroll under the player
        SetLocalObject (oPC, "o_PL_Bedrollrest", oRestbedroll); // Temporary "global" variable. Gets deleted after deletion of the bedroll.
        SetLocalInt (oPC, "i_TI_LastRest", GetHourTimeZero()); // Set Last Rest Time
      }
      else
      { // Resting IS NOT allowed
        AssignCommand (oPC, ClearAllActions()); // Prevent Resting
        SendMessageToPC (oPC, "You can't rest. Hostiles nearby");
      }
    }
  }
  // ---------- Rest Event finished or aborted ----------
  if ((GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED || GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) && GetIsObjectValid(GetLocalObject (oPC, "o_PL_Bedrollrest")))
  { // If a bedroll was placed under the player: Delete it
    DestroyObject (GetLocalObject (oPC, "o_PL_Bedrollrest"), 0.0f);
    DeleteLocalObject (oPC, "o_PL_Bedrollrest");
  }
}

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.