forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
186 lines
7.3 KiB
Plaintext
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
|
|
|
|
|