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.
237 lines
8.1 KiB
Plaintext
237 lines
8.1 KiB
Plaintext
#include "prc_alterations"
|
|
#include "prc_inc_teleport"
|
|
|
|
int ValidateActivator(object oActivator);
|
|
void ResetArea(object oArea);
|
|
object GetExitOfNextMansion();
|
|
int GetMaxMansions();
|
|
|
|
void main()
|
|
{
|
|
// Getthe activator of the door, and make sure he is in
|
|
// the same party as whoever cast the mansion.
|
|
object oActivator = GetLastUsedBy();
|
|
if (!ValidateActivator(oActivator)) return;
|
|
|
|
// Load the activator's current area and party leader.
|
|
object aActivator = GetArea(oActivator);
|
|
object oActivatorLeader = GetFactionLeader(oActivator);
|
|
location oActivatorLoc = GetLocation(oActivator);
|
|
|
|
// Get the mansion exit object, we'll dump the party by that.
|
|
object oExit = GetExitOfNextMansion();
|
|
if (GetIsObjectValid(oExit))
|
|
{
|
|
// OK we've gotten to the point where SOMEBODY should be going in
|
|
// a mansion, play the door opening sound effect.
|
|
PlaySound("as_dr_metlvlgop1");
|
|
|
|
// Reset the mansion by cleaning up any junk.
|
|
object aMansion = GetAreaFromLocation(GetLocation(oExit));
|
|
ResetArea(aMansion);
|
|
|
|
// Temporarily disable the teleportation forbiddance in the mansion
|
|
int nForbid = GetLocalInt(aMansion, PRC_DISABLE_TELEPORTATION_IN_AREA);
|
|
DeleteLocalInt(aMansion, PRC_DISABLE_TELEPORTATION_IN_AREA);
|
|
|
|
location loc = Location(aMansion, GetPosition(oExit), GetFacing(oExit));
|
|
|
|
// Loop through all the players and check to see if they are in
|
|
// the same party as the activator and in the same area, if they
|
|
// are then they go to the mansion.
|
|
object oPC = GetFirstPC();
|
|
while (GetIsObjectValid(oPC))
|
|
{
|
|
if (aActivator == GetArea (oPC) &&
|
|
oActivatorLeader == GetFactionLeader(oPC) &&
|
|
GetCanTeleport(aActivator, loc, TRUE, TRUE)
|
|
)
|
|
{
|
|
// Save the PC's return location so they always go to the right
|
|
// spot.
|
|
SetLocalLocation(oPC, "MMM_RETURNLOC", oActivatorLoc);
|
|
AssignCommand(oPC, DelayCommand(1.0, ActionJumpToLocation(loc)));
|
|
}
|
|
|
|
oPC = GetNextPC();
|
|
}
|
|
|
|
// Restore the old forbiddance value
|
|
SetLocalInt(aMansion, PRC_DISABLE_TELEPORTATION_IN_AREA, nForbid);
|
|
|
|
// Link the exit door to the entrance so we know which entrance
|
|
// to put the party back at (in case more than 1 mansion gets
|
|
// cast).
|
|
SetLocalObject(oExit, "MMM_ENTRANCE", OBJECT_SELF);
|
|
}
|
|
else
|
|
{
|
|
PrintString("All mansions are full, increase the number of mansions.");
|
|
ActionSpeakString("NO VACANCIES!");
|
|
DestroyObject(OBJECT_SELF);
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// This method validates the door activator to make sure he is
|
|
// a member of the party of the wizard that cast the MMM spell.
|
|
// Only members of the party may enter the mansion.
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
int ValidateActivator(object oActivator)
|
|
{
|
|
// Get the caster that made the mansion, if we can't do that then
|
|
// either the caster poofed or the mansion is corrupt, either
|
|
// way destroy the door in.
|
|
object oCaster = GetLocalObject(OBJECT_SELF, "MMM_CASTER");
|
|
if (!GetIsObjectValid(oCaster))
|
|
{
|
|
DestroyObject(OBJECT_SELF);
|
|
return FALSE;
|
|
}
|
|
|
|
// Return TRUE if the leader of the activator's party and the
|
|
// caster's party are identical.
|
|
return GetFactionLeader(oActivator) == GetFactionLeader(oCaster);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// This method resets a mansion back to it's original state.
|
|
// It closes all containers/doors and deletes any items that
|
|
// do not have the "MMM_ITEM" local int attached to them.
|
|
// (to prevent players from storing stuff in the mansion)
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
void ResetArea(object oArea)
|
|
{
|
|
object oTarget = GetFirstObjectInArea(oArea);
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
// All containers/doors should be closed.
|
|
if (GetIsOpen(oTarget))
|
|
ActionCloseDoor(oTarget);
|
|
|
|
// Any objects not marked as part of the area should be destroyed.
|
|
if (!GetLocalInt(oTarget, "MMM_ITEM"))
|
|
DestroyObject(oTarget);
|
|
|
|
oTarget = GetNextObjectInArea(oArea);
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// This method returns the exit door object from the next
|
|
// mansion in sequence. If you are using a server that
|
|
// supports multple parties you should make additional copies
|
|
// of the mansion area (changing the tags of the exit doors
|
|
// to number them in sequence, MordsMansExit01, MordsMansExit02,
|
|
// MordsMansExit03, etc. and set nNumMansions to the number of
|
|
// mansion areas you have. This will cycle through the areas
|
|
// to prevent 2 players from getting the same mansion.
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
int GetNextMansionIndex()
|
|
{
|
|
int nNumMansions = GetMaxMansions();
|
|
|
|
// Get the next available mansion from the module, and
|
|
// convert from 0 bias to 1 bias, then increment the counter.
|
|
object oModule = GetModule();
|
|
int nNextMansion = GetLocalInt(oModule, "MMM_NEXTMANSION") + 1;
|
|
if (nNextMansion > nNumMansions) nNextMansion = 1;
|
|
|
|
// Save our mansion incrementor back to the module.
|
|
SetLocalInt(oModule, "MMM_NEXTMANSION", nNextMansion);
|
|
|
|
return nNextMansion;
|
|
}
|
|
|
|
object GetExitOfNextMansion()
|
|
{
|
|
// Loop through all of the mansions looking for one that is
|
|
// currently unoccupied.
|
|
int nNumMansions = GetMaxMansions();
|
|
int i;
|
|
for(i= 0; i < nNumMansions; i++)
|
|
{
|
|
// Get the next mansion in sequence.
|
|
int nNextMansion = GetNextMansionIndex();
|
|
PrintString("nNextMansion = " + IntToString(nNextMansion));
|
|
string sExitName = "MordsMansExit" + (nNextMansion < 10 ? "0" : "") +
|
|
IntToString(nNextMansion);
|
|
|
|
// Get the exit object and the area that the exit object is in, i.e.
|
|
// the mansion.
|
|
object oExit = GetObjectByTag(sExitName, 0);
|
|
object oArea = GetArea(oExit);
|
|
|
|
// Loop through all of the objects in the mansion area to see if
|
|
// there are any PC's in the area. If there are then the mansion
|
|
// is occupied.
|
|
int fOccupied = FALSE;
|
|
object oObject = GetFirstObjectInArea(oArea);
|
|
while (GetIsObjectValid(oObject))
|
|
{
|
|
if (GetIsPC(oObject))
|
|
{
|
|
PrintString("Area " + IntToString(nNextMansion) + " is OCCUPIED");
|
|
fOccupied = TRUE;
|
|
break;
|
|
}
|
|
|
|
oObject = GetNextObjectInArea(oArea);
|
|
}
|
|
|
|
// If the mansion is unoccupied then return it.
|
|
PrintString("returning mansion " + IntToString(nNextMansion));
|
|
if (!fOccupied) return oExit;
|
|
}
|
|
|
|
// All mansions are occupied, sorry out of luck!
|
|
PrintString("ALL mansions are OCCUPIED");
|
|
return OBJECT_INVALID;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// This method returns the maximum number of mansion instances
|
|
// available in the module. The first time it is called it
|
|
// counts the number of mansions and saves it in the module,
|
|
// subsequent calls use the saved value.
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
int GetMaxMansions()
|
|
{
|
|
// Get the buffered number of mansions from the module, if
|
|
// it's been stored.
|
|
object oModule = GetModule();
|
|
int nMaxMansion = GetLocalInt(oModule, "MMM_MAXMANSION");
|
|
if (nMaxMansion > 0) return nMaxMansion;
|
|
|
|
// Run a loop to keep getting mansion exit doors until we cannot get one
|
|
// any more, this will tell us how many mansions there are in the module.
|
|
int i = 1;
|
|
for(;; i++)
|
|
{
|
|
string sExitName = "MordsMansExit" + (i < 10 ? "0" : "") + IntToString(i);
|
|
if (!GetIsObjectValid(GetObjectByTag(sExitName, 0))) break;
|
|
}
|
|
|
|
// Save the number of mansions in the module and return that value.
|
|
PrintString("GetMaxMansion counts " + IntToString(i-1) + " mansions");
|
|
SetLocalInt(oModule, "MMM_MAXMANSION", i - 1);
|
|
return i - 1;
|
|
}
|
|
|