generated from Jaysyn/ModuleTemplate
178 lines
6.6 KiB
Plaintext
178 lines
6.6 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name: torch_OnEquip Rev. 3
|
|
//:: FileName: loc_inc_torches
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
this "include" script is a customized OnEquipItem
|
|
package which will manage the lifetimes of torches
|
|
so that they will burn out after a set amount of
|
|
time, customizable by the module builder.
|
|
|
|
useful for low-magic or "real world" settings.
|
|
developed for single-player modules; some
|
|
modification MIGHT be necessary for use in multi-
|
|
player. then again, it might work out of the box!
|
|
|
|
IF YOU END UP USING THIS IN A PUBLISHED SINGLE-PLAYER,
|
|
MULTIPLAYER OR PERSISTENT WORLD PROJECT, PLEASE LET
|
|
ME KNOW! THANKS!
|
|
|
|
More info: this script is different from the other
|
|
torch management scripts out there in that it does
|
|
NOT rely on the module heartbeat event! (some people
|
|
HATE using heartbeat events) this script
|
|
uses a "pseudo" heartbeat function (recursive
|
|
DelayCommand). therefore, the script
|
|
only runs when it NEEDS to run - while a
|
|
regular heartbeat always runs every 6 seconds!
|
|
|
|
Usage: Import the included ERF file into your module.
|
|
Put "torch_onequip" and "torch_onunequip" as your
|
|
"OnPlayerEquipItem" and "OnPlayerUnEquipItem" events,
|
|
respectively. Do a full build of your module.
|
|
|
|
If you already have scripts specified for those 2 events,
|
|
add the following commands to those files:
|
|
|
|
1. at the top of the EquipItem script put the line:
|
|
|
|
#include "loc_inc_torches"
|
|
|
|
2. also in the script for EquipItem put the following within
|
|
the "void main" section:
|
|
|
|
object oItem = GetPCItemLastEquipped();
|
|
if (GetTag(oItem) == "NW_IT_TORCH001")
|
|
{
|
|
TorchPrep(oItem);
|
|
}
|
|
|
|
3. in the script for UnEquipItem put the following in the
|
|
"void main" section (no "include" line needed):
|
|
|
|
object oItem = GetPCItemLastUnequipped();
|
|
if (GetTag(oItem) == "NW_IT_TORCH001")
|
|
{
|
|
SetLocalInt(oItem, "TorchInHands", 0);
|
|
}
|
|
|
|
Done and done!
|
|
|
|
|
|
ADVANCED INFO: Below, change the constant TORCH_LIFESPAN
|
|
to suit your needs. Default torch lifespan is
|
|
20 realtime min.
|
|
|
|
Change the constant WANT_DIMMING if you don't
|
|
like the dimming effect when the clock is at 60 seconds remaining.
|
|
I think its kinda cool. It basically changes the torch's
|
|
light property to a Dim Red light and makes it "flicker".
|
|
|
|
This script package only works with the standard torches
|
|
from the Aurora Toolset palette unless you modify accordingly.
|
|
This script WILL keep track of the lifespan of EACH individual
|
|
torch by saving state. This script will ALSO keep track of torch
|
|
lifespans through savegames.
|
|
|
|
One issue I have found is that when you unequip/re-equip
|
|
the same torch repeatedly you may lose some life from it
|
|
depending on how close to the next pseudo-HB you
|
|
unequipped it. To fix this issue I would have to lower the time
|
|
between each pseudo-HB which isn't really worth it, since
|
|
that's essentially going back to the OnHeartbeat model we
|
|
are so trying to avoid.
|
|
|
|
Credits: Rev. 2 was mostly done by myself. I got the pseudo-HB
|
|
idea from a script by DenOfAssassins and of course thanks
|
|
to BioWare for including that nifty new "OnEquipItem" event
|
|
handler in HotU 1.59.
|
|
|
|
In Rev. 3 no real new functionality was added, just re-organized
|
|
everything into an easy-to-use INCLUDE file, since thats
|
|
how all the other "OnEquipItem" scripts are being packaged!
|
|
Also, I am now using FloatyText instead of sending the player
|
|
a console message. So the player is more aware of the fact his
|
|
torch is slowly burning away. Before, it was easy to lose that
|
|
message in the jumble of stuff on most people's consoles.
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: LoCash (LoCash@sympatico.ca)
|
|
//:: Created On: 12/15/03
|
|
//:: Rev.2 created on: 12/19/03
|
|
//:: Rev.3 created on: 01/23/04
|
|
//:://////////////////////////////////////////////
|
|
|
|
// GLOBAL CONSTANTS ------------------------------
|
|
|
|
// TORCH_LIFESPAN: change this value to (lifespan in realtime minutes * 3) + 1
|
|
// default value of 61 means 20 minutes.
|
|
const int TORCH_LIFESPAN = 31;
|
|
|
|
// WANT_DIMMING: change to FALSE if you don't want dimming effect @ 60 sec. remaining
|
|
const int WANT_DIMMING = TRUE;
|
|
|
|
|
|
// PROTOTYPES -------------------------------------
|
|
|
|
// Initializes Torch Management & Begins PseudoHeartbeat Sequence
|
|
void TorchPrep(object oItem);
|
|
|
|
// PseudoHeartbeat function which keeps track of torch's lifetime
|
|
void TorchPseudoHB(object oObject, int hbSessionID);
|
|
|
|
|
|
// DEFINITIONS ------------------------------------
|
|
void TorchPrep(object oItem)
|
|
{
|
|
int iTorchLife = GetLocalInt(oItem, "TorchLife"); // get life value from torch
|
|
int iTorchInHands = GetLocalInt(oItem, "TorchInHands");
|
|
if (iTorchLife == 0)
|
|
{
|
|
iTorchLife = TORCH_LIFESPAN; // brand-new torches get lifespan set
|
|
}
|
|
SetLocalInt(oItem, "TorchLife", iTorchLife); // pass torchlife back to object
|
|
if (iTorchInHands != 1)
|
|
{
|
|
SetLocalInt(oItem, "TorchInHands", 1); // flag torch is "in PC's hands" now
|
|
int iSessionID = (Random(999) + 1); // create almost-unique session ID
|
|
SetLocalInt(oItem, "SessionID", iSessionID); // store it on torch
|
|
TorchPseudoHB(oItem, iSessionID); // run pseudoHB function
|
|
}
|
|
}
|
|
|
|
void TorchPseudoHB(object oObject, int hbSessionID)
|
|
{
|
|
int hbTorchInHands = GetLocalInt(oObject, "TorchInHands");
|
|
int hbTorchLife = GetLocalInt(oObject, "TorchLife");
|
|
int objSessionID = GetLocalInt(oObject, "SessionID");
|
|
object oPC = GetItemPossessor(oObject);
|
|
object oTorch = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
|
if ((oTorch == oObject) && (hbTorchInHands != 0) && (objSessionID == hbSessionID))
|
|
{
|
|
if (hbTorchLife > 1)
|
|
{
|
|
if ((hbTorchLife == 4) && (WANT_DIMMING == TRUE))
|
|
{
|
|
ExecuteScript("torch_dimmer", oObject);
|
|
FloatingTextStringOnCreature("Your torch begins to fade away...",oPC,FALSE);
|
|
}
|
|
hbTorchLife--;
|
|
SetLocalInt(oObject, "TorchLife", hbTorchLife);
|
|
DelayCommand(20.0, AssignCommand(oObject, TorchPseudoHB(oObject, hbSessionID)));
|
|
return;
|
|
}
|
|
if (hbTorchLife <= 1)
|
|
{
|
|
DestroyObject(oObject, 0.4f);
|
|
FloatingTextStringOnCreature("Your torch sputters out and dies.",oPC,FALSE);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// debug
|
|
// void main() {}
|