PRC8/nwn/nwnprc/trunk/scripts/sbr_onrest.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

186 lines
7.3 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name Demetrious' Supply Based Rest
//:: FileName SBR_onrest
//:://////////////////////////////////////////////
// http://nwvault.ign.com/Files/scripts/data/1055903555000.shtml
/*
This script belongs in the module level properties
in the OnPlayerRest event script. Includes an alert
to all DMs.
*/
//:://////////////////////////////////////////////
//:: Created By: Demetrious
//:://////////////////////////////////////////////
//:: Credit to: Timo "Lord Gsox" Bischoff (NWN Nick: Kihon)
//:: and the HCR team for the subroutines and effects
//:: If not copied, at least I used their ideas. :)
#include "prc_alterations"
#include "sbr_include"
void ApplySleepEffects(object oPC)
{
if (GetIsDM(oPC) || GetIsDMPossessed(oPC)) return;
// Signal the module that a player is resting.
SignalEvent(GetModule(), EventUserDefined(SBR_EVENT_REST));
LogMessage(LOG_DM_40, oPC, "Rest Alert: "+GetName(oPC) + " is resting.");
SetLocalInt(oPC,SBR_RESTING,1);
effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
//insert special effects here. I tried EffectSleep along with different
//animations. They either get overrode by the rest anim or cancel the rest.
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
FadeToBlack(oPC);
SetPanelButtonFlash(oPC,PANEL_BUTTON_REST,0);
}
void RemoveSleepBlindness(object oPC)
{
FadeFromBlack(oPC);
}
// The main function placed in the onRest event
void main()
{
// Script Settings (Variable Declaration)
object oPC = GetLastPCRested();
object oArea = GetArea(oPC);
int nLastRestType = GetLastRestEventType();
if (nLastRestType == REST_EVENTTYPE_REST_STARTED)
{
int Supplykit=FALSE;
object oItem = GetFirstItemInInventory(oPC);
while (GetIsObjectValid(oItem))
{
if ((GetTag(oItem)==SBR_KIT_REGULAR)|| (GetTag(oItem)==SBR_KIT_WOODLAND))
{
Supplykit =TRUE;
break;
}
else
{
oItem = GetNextItemInInventory(oPC);
}
}
// if you have supplies in your inventory - this is TRUE
int n=1; string sTag; int SupplyNearby=FALSE;
while (n<5)
{
switch (n)
{
case 1: sTag = "campingbedroll";break;
case 2: sTag = "restfulbed";break;
case 3: sTag = "restfulbedroll";break;
case 4: sTag = "restfulcot";break;
}
object oN = GetNearestObjectByTag(sTag, oPC, 1);
if (GetIsObjectValid(oN) && (GetDistanceBetween(oN, oPC)<SBR_DISTANCE))
{
SupplyNearby=TRUE;
break;
}
n=n+1;
}
// if you clicked a restful object OR there is one near - this is TRUE
if (GetLocalInt (oPC, SBR_SUPPLIES)==1) //check for safe condition already done
{
ApplySleepEffects(oPC);
SetLocalInt(oPC, SBR_SUPPLIES, 0);
return;
}
if ((Supplykit) || (SupplyNearby) || (GetLocalInt (oPC, SBR_USED_KIT) ==1))
{
//code here for the version 1.3 trigger.
if (NotOnSafeRest(oPC)==TRUE)
{
LogMessage(LOG_PARTY_30, oPC, "You should find a secure area before trying to rest.");
LogMessage(LOG_DM_20, oPC, "Resting Alert: "+ GetName(oPC)+ " prevented from resting by Bioware resting trigger.");
AssignCommand (oPC, ClearAllActions());
return;
}
//code here for the DM resting widget.
if (!CanIRest(oPC))
{
LogMessage(LOG_PARTY_30, oPC, "The danger present in the region prevents resting.");
LogMessage(LOG_DM_20, oPC, "Resting Prevented: "+ GetName(oPC)+ " in area: "+GetName(GetArea(oPC)) +" by Rest Widget settings.");
AssignCommand (oPC, ClearAllActions());
return;
}
// 3 options
if (GetLocalInt(oPC, SBR_USED_KIT)==1)
{
DestroyObject(oItem);
object Bedroll = CreateObject(OBJECT_TYPE_PLACEABLE, "campingbedroll", GetLocation(oPC), TRUE);//This is now a campfire rather than a bedroll but same resref
DelayCommand(2.0, AssignCommand(Bedroll, PlaySound("al_cv_firecppot1")));
DestroyObject(Bedroll, 300.0);
DeleteLocalInt(oPC, SBR_USED_KIT);
LogMessage(LOG_PARTY_30, oPC, GetName(oPC)+" quickly puts together a nice campsite.");
ApplySleepEffects(oPC);
return;
}
if (SupplyNearby)
{
ApplySleepEffects(oPC);
return;
}
else
{
// if you are here then you have hit 'r' and have supplies so warn.
if (GetLocalInt(oPC, "REST_CLICK")!=1)
{
AssignCommand(oPC, ClearAllActions());
SetLocalInt(oPC, "REST_CLICK", 1);
DelayCommand(15.0, DeleteLocalInt(oPC, "REST_CLICK"));
LogMessage(LOG_PC, oPC, "There is no 'restful' object nearby. Press 'r' again to build a campsite with supplies.");
return;
}
else
{
DestroyObject(oItem);
object Bedroll = CreateObject(OBJECT_TYPE_PLACEABLE, "campingbedroll", GetLocation(oPC), TRUE);//This is now a campfire rather than a bedroll but same resref
DelayCommand(2.0, AssignCommand(Bedroll, PlaySound("al_cv_firecppot1")));
DestroyObject(Bedroll, 300.0);
DeleteLocalInt(oPC, SBR_USED_KIT);
LogMessage(LOG_PARTY_30, oPC, GetName(oPC)+" quickly puts together a nice campsite.");
ApplySleepEffects(oPC);
}
}//close else 162
}//close if 124
else
{
AssignCommand (oPC, ClearAllActions()); // Prevent Resting
LogMessage(LOG_PC, oPC, "You do not have adequate supplies to rest here.");
}
}//close Rest_started
if (nLastRestType == REST_EVENTTYPE_REST_FINISHED || nLastRestType == REST_EVENTTYPE_REST_CANCELLED)
{
RemoveSleepBlindness(oPC);
}
} // close main