737 lines
26 KiB
Plaintext
737 lines
26 KiB
Plaintext
//::///////////////////////////////////////////////
|
||
//::// Jyro X's Prestige Inlude
|
||
//::// JX_PRESTIGE_INC.nss
|
||
//::// Copyright © 2001 Bioware Corp.
|
||
//::// Copyright © 2003 Cory Lindsey
|
||
//::// Version 1.62 (HotU UPDATED)
|
||
//:://////////////////////////////////////////////
|
||
/*
|
||
Below is the description and instructions.
|
||
Just give credit where credit is due please.
|
||
!!!PLEASE READ INSTRUCTIONS BELOW!!!
|
||
*/
|
||
//:://////////////////////////////////////////////
|
||
/*
|
||
|
||
//////////////////////////////
|
||
///!!!NOTE TO ALL USERS:!!!///
|
||
//////////////////////////////
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
Yes. I know many have used these functions and found many bugs.
|
||
Luckily, I have implemented new, inline, speed-enhancing
|
||
scripting methods to make the code work perfectly. There are now
|
||
NO errors, no unhandled exceptions or anything if the functions
|
||
are used correctly. Note: This include does not require any
|
||
haks or overrides. It is built to use the BioWare-implemented
|
||
2da's. So therefore, you need not to put anything into an
|
||
override folder on the server for your module. All you need
|
||
is this file and a decent scripter. If you have any questions
|
||
or complaints, you may reach me at the following email address:
|
||
|
||
cory@skyhop.com
|
||
|
||
Thank you,
|
||
Jyro X
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
|
||
This is an include file used for various operations
|
||
concerning Prestige Classes available with SoU(Shadows
|
||
of Undrentide, Copyright © BioWare Corp.) and HotU(Hordes
|
||
of the Underdark, Copyright © BioWare Corp.). List of
|
||
available functions:
|
||
|
||
JXDestroyPrestige
|
||
JXRebuildPrestige
|
||
RestrictAllPrestigeClasses
|
||
RestrictPrestigeClass
|
||
GetAbleToLevelPrestigeClass
|
||
|
||
In order to use these functions in any script you create,
|
||
at the top of your script before you type anything else,
|
||
type:
|
||
|
||
#include "jx_prestige_inc"
|
||
|
||
and click the little computer symbol in the upper-left
|
||
hand corner. The custom functions will show up in bold
|
||
black in the "Functions" list in your editor.
|
||
In order for the persistency to work!!!:
|
||
|
||
Put the following line of code into your OnClientEnter:
|
||
JXRebuildPrestige(oPC);
|
||
|
||
You must first however, define oPC with something like:
|
||
object oPC = GetEnteringObject();
|
||
|
||
Those steps will make the persistency work.
|
||
*/
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Cory Lindsey (a.k.a. Jyro X)
|
||
//:: Created On: 9/11/03
|
||
//:://////////////////////////////////////////////
|
||
|
||
//!!!Custom constants!!! !!!DO NOT EDIT!!!:
|
||
const string JX_PRES_DB = "JX_PRESTIGE_DATABASE";
|
||
const string ARCANE_ARCHER = "X1_AllowArcher";
|
||
const string ASSASSIN = "X1_AllowAsasin";
|
||
const string BLACKGUARD = "X1_AllowBlkGrd";
|
||
const string CHAMP_TORM = "X2_AllowDivcha";
|
||
const string DRAG_DISC = "X1_AllowDrDis";
|
||
const string DWARF_DEF = "X1_AllowDwDef";
|
||
const string HARPER_SCOUT = "X1_AllowHarper";
|
||
const string PALE_MASTER = "X2_AllowPalema";
|
||
const string SHADOW_DANCER = "X1_AllowShadow";
|
||
const string SHIFT = "X2_AllowShiftr";
|
||
const string WPN_MASTER = "X2_AllowWM";
|
||
//End constants...
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////!!!!!!!!!!!!!!!!!!!!!!BEGIN PRESTIGE FUNCTIONS!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//Use this in your OnClientEnter.
|
||
//It rebuilds the prestige resctrictions on oPC.
|
||
void JXRebuildPrestige(object oPC);
|
||
|
||
//Cleans the JX Database, therefore starting everyone on a clean slate.
|
||
void JXDestroyPrestige();
|
||
|
||
//Ordinary: Use this in the OnEnter event handler of your module.
|
||
//- oPC: The PC in question.
|
||
//- bAllow: Allow or disallow.
|
||
//
|
||
// TRUE = Restricts the classes.
|
||
// FALSE = Un-restricts the classes.
|
||
//
|
||
//- bPermanent: Saves to database, therefore restricting permanently until removed.
|
||
//
|
||
// TRUE = Restricts even through server restart.
|
||
// FALSE = Restricts only until PC leaves and re-enters.
|
||
//
|
||
//- bSendMessage: Sends a message to the PC letting them know all prestige classes have been restricted or un-restricted.
|
||
//
|
||
// TRUE = Sends the message.
|
||
// FALSE = Does NOT send the message
|
||
//
|
||
//- bOverride: Whether or not it will be restricted if the PC already has a level in said class.
|
||
//
|
||
// TRUE = Overrides even if they have the class.
|
||
// FALSE = Does not override if the PC has a level in the class.
|
||
//
|
||
//Function: Restricts prestige classes until the PC earns it.
|
||
void RestrictAllPrestigeClasses(object oPC, int bAllow=FALSE, int bPermanent=FALSE, int bSendMessage=TRUE, int bOverride = FALSE);
|
||
|
||
//Ordinary: Use this in the OnEnter event handler of your module.
|
||
//- oPC: The PC in question.
|
||
//- nClassType: The class you want to restrict(Must be prestige).
|
||
//- bAllow: Allow or disallow.
|
||
//
|
||
// TRUE = Restricts the class.
|
||
// FALSE = Un-restricts the class.
|
||
//
|
||
//- bPermanent: Saves to database, therefore restricting permanently until removed.
|
||
//
|
||
// TRUE = Restricts even through server restart.
|
||
// FALSE = Restricts only until PC leaves and re-enters.
|
||
//
|
||
//- bSendMessage: Sends a message to the PC letting them know the class has been restricted or un-restricted.
|
||
//
|
||
// TRUE = Sends the message.
|
||
// FALSE = Does NOT send the message
|
||
//
|
||
//- bOverride: Whether or not it will be restricted if the PC already has a level in said class.
|
||
//
|
||
// TRUE = Overrides even if they have the class.
|
||
// FALSE = Does not override if the PC has a level in the class.
|
||
//
|
||
//Function: Restricts prestige class until the PC earns it.
|
||
void RestrictPrestigeClass(object oPC, int nClassType, int bAllow=FALSE, int bPermanent=FALSE, int bSendMessage=TRUE, int bOverride = FALSE);
|
||
|
||
//Use this to check if the PC is able to take a level in the supplied
|
||
//prestigeous class.
|
||
//-oPC: PC to check.
|
||
//-nClassType: Class to check for.
|
||
//Function: Checks to see if the PC can level up as an nClassType(Must be prestige).
|
||
//Usually used in text appears when situations.
|
||
//Example Syntax: if(GetAbleToLevelPrestigeClass(oPC, CLASS_TYPE_*) == TRUE){return TRUE;}
|
||
int GetAbleToLevelPrestigeClass(object oPC, int nClassType);
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////METHODs USED WITHIN THE CODE - DISREGARD!////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
string ClassToStringInt(int nClass)
|
||
{
|
||
string sResult="";
|
||
|
||
switch(nClass)
|
||
{
|
||
case CLASS_TYPE_ARCANE_ARCHER:
|
||
sResult=ARCANE_ARCHER;
|
||
break;
|
||
case CLASS_TYPE_ASSASSIN:
|
||
sResult=ASSASSIN;
|
||
break;
|
||
case CLASS_TYPE_BLACKGUARD:
|
||
sResult=BLACKGUARD;
|
||
break;
|
||
case CLASS_TYPE_DIVINECHAMPION:
|
||
sResult=CHAMP_TORM;
|
||
break;
|
||
case CLASS_TYPE_DRAGONDISCIPLE:
|
||
sResult=DRAG_DISC;
|
||
break;
|
||
case CLASS_TYPE_DWARVENDEFENDER:
|
||
sResult=DWARF_DEF;
|
||
break;
|
||
case CLASS_TYPE_HARPER:
|
||
sResult=HARPER_SCOUT;
|
||
break;
|
||
case CLASS_TYPE_PALEMASTER:
|
||
sResult=PALE_MASTER;
|
||
break;
|
||
case CLASS_TYPE_SHIFTER:
|
||
sResult=SHIFT;
|
||
break;
|
||
case CLASS_TYPE_SHADOWDANCER:
|
||
sResult=SHADOW_DANCER;
|
||
break;
|
||
case CLASS_TYPE_WEAPON_MASTER:
|
||
sResult=WPN_MASTER;
|
||
break;
|
||
}
|
||
|
||
return sResult;
|
||
}
|
||
|
||
string ConvertClassType(int nClassType)
|
||
{
|
||
string class="";
|
||
|
||
switch(nClassType)
|
||
{
|
||
case CLASS_TYPE_ARCANE_ARCHER:
|
||
class="Arcane Archer";
|
||
break;
|
||
case CLASS_TYPE_ASSASSIN:
|
||
class="Assassin";
|
||
break;
|
||
case CLASS_TYPE_BLACKGUARD:
|
||
class="Blackgaurd";
|
||
break;
|
||
case CLASS_TYPE_DIVINECHAMPION:
|
||
class="Champion of Torm";
|
||
break;
|
||
case CLASS_TYPE_DRAGONDISCIPLE:
|
||
class="Dragon Disciple";
|
||
break;
|
||
case CLASS_TYPE_DWARVENDEFENDER:
|
||
class="Dwarven Defender";
|
||
break;
|
||
case CLASS_TYPE_HARPER:
|
||
class="Harper Scout";
|
||
break;
|
||
case CLASS_TYPE_PALEMASTER:
|
||
class="Pale Master";
|
||
break;
|
||
case CLASS_TYPE_SHADOWDANCER:
|
||
class="Shadow Dancer";
|
||
break;
|
||
case CLASS_TYPE_SHIFTER:
|
||
class="Shifter";
|
||
break;
|
||
case CLASS_TYPE_WEAPON_MASTER:
|
||
class="Weapon Master";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return class;
|
||
}
|
||
int GetHasSpellCasting(int nLevel, object oPC)
|
||
{
|
||
int nTotal;
|
||
nTotal = GetLevelByClass(CLASS_TYPE_BARD,oPC)+
|
||
GetLevelByClass(CLASS_TYPE_WIZARD)+
|
||
GetLevelByClass(CLASS_TYPE_SORCERER,oPC);
|
||
if(nTotal>=nLevel)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
int GetHasAlternateForm(object oPC)
|
||
{
|
||
if(GetHasFeat(FEAT_ELEMENTAL_SHAPE, oPC) ||
|
||
GetHasFeat(FEAT_EPIC_WILD_SHAPE_DRAGON, oPC) ||
|
||
GetHasFeat(FEAT_EPIC_WILD_SHAPE_UNDEAD, oPC) ||
|
||
GetHasFeat(FEAT_GREATER_WILDSHAPE_1, oPC) ||
|
||
GetHasFeat(FEAT_GREATER_WILDSHAPE_2, oPC) ||
|
||
GetHasFeat(FEAT_GREATER_WILDSHAPE_3, oPC) ||
|
||
GetHasFeat(FEAT_GREATER_WILDSHAPE_4, oPC) ||
|
||
GetHasFeat(FEAT_WILD_SHAPE, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
int GetHasMeleeWeaponFocus(object oPC)
|
||
{
|
||
if(GetHasFeat(FEAT_WEAPON_FOCUS_BASTARD_SWORD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_BATTLE_AXE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_CLUB, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_DAGGER, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_DIRE_MACE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_DOUBLE_AXE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_DWAXE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_GREAT_AXE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_GREAT_SWORD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_HALBERD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_HAND_AXE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_FLAIL, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_KAMA, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_KATANA, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_KUKRI, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_FLAIL, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_HAMMER, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_MACE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_LONG_SWORD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_MORNING_STAR, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_RAPIER, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SCIMITAR, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SCYTHE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SHORT_SWORD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SICKLE, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SPEAR, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_TWO_BLADED_SWORD, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_WAR_HAMMER, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//------------------------------------------------------------------------------
|
||
void JXDestroyPrestige()
|
||
{
|
||
DestroyCampaignDatabase(JX_PRES_DB);
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
void JXRebuildPrestige(object oPC)
|
||
{
|
||
if(!GetIsObjectValid(oPC))
|
||
return;
|
||
|
||
int nArcane = GetCampaignInt(JX_PRES_DB, ARCANE_ARCHER, oPC);
|
||
int nAssassin = GetCampaignInt(JX_PRES_DB, ASSASSIN, oPC);
|
||
int nBlackgaurd = GetCampaignInt(JX_PRES_DB, BLACKGUARD, oPC);
|
||
int nChampion = GetCampaignInt(JX_PRES_DB, CHAMP_TORM, oPC);
|
||
int nDrag = GetCampaignInt(JX_PRES_DB, DRAG_DISC, oPC);
|
||
int nDwarf = GetCampaignInt(JX_PRES_DB, DWARF_DEF, oPC);
|
||
int nHarper = GetCampaignInt(JX_PRES_DB, HARPER_SCOUT, oPC);
|
||
int nPale = GetCampaignInt(JX_PRES_DB, PALE_MASTER, oPC);
|
||
int nShadow = GetCampaignInt(JX_PRES_DB, SHADOW_DANCER, oPC);
|
||
int nShift = GetCampaignInt(JX_PRES_DB, SHIFT, oPC);
|
||
int nWpnMstr = GetCampaignInt(JX_PRES_DB, WPN_MASTER, oPC);
|
||
|
||
if(nArcane > 0)
|
||
SetLocalInt(oPC, ARCANE_ARCHER, 1);
|
||
|
||
if(nAssassin > 0)
|
||
SetLocalInt(oPC, ASSASSIN, 1);
|
||
|
||
if(nBlackgaurd > 0)
|
||
SetLocalInt(oPC, BLACKGUARD, 1);
|
||
|
||
if(nChampion > 0)
|
||
SetLocalInt(oPC, CHAMP_TORM, 1);
|
||
|
||
if(nDrag > 0)
|
||
SetLocalInt(oPC, DRAG_DISC, 1);
|
||
|
||
if(nDwarf > 0)
|
||
SetLocalInt(oPC, DWARF_DEF, 1);
|
||
|
||
if(nHarper > 0)
|
||
SetLocalInt(oPC, HARPER_SCOUT, 1);
|
||
|
||
if(nPale > 0)
|
||
SetLocalInt(oPC, PALE_MASTER, 1);
|
||
|
||
if(nShadow > 0)
|
||
SetLocalInt(oPC, SHADOW_DANCER, 1);
|
||
|
||
if(nShift > 0)
|
||
SetLocalInt(oPC, SHIFT, 1);
|
||
|
||
if(nWpnMstr > 0)
|
||
SetLocalInt(oPC, WPN_MASTER, 1);
|
||
|
||
}
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////RESTRICTALLPRESTIGECLASSES//////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
void RestrictAllPrestigeClasses(object oPC, int bAllow=FALSE, int bPermanent=FALSE, int bSendMessage=TRUE, int bOverride=FALSE)
|
||
{
|
||
if(GetIsPC(oPC) && !GetIsDM(oPC)) //allow DM's whatever.
|
||
{
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_ARCANE_ARCHER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_ASSASSIN, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_BLACKGUARD, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_DIVINECHAMPION, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_DRAGONDISCIPLE, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_DWARVENDEFENDER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_HARPER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_PALEMASTER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_SHADOWDANCER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_SHIFTER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
RestrictPrestigeClass(oPC, CLASS_TYPE_WEAPON_MASTER, bAllow, bPermanent, bSendMessage, bOverride);
|
||
}
|
||
|
||
else
|
||
return;
|
||
}
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////RESTRICTPRESTIGECLASS/////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
void RestrictPrestigeClass(object oPC, int nClassType, int bAllow=FALSE, int bPermanent=FALSE, int bSendMessage=TRUE, int bOverride = FALSE)
|
||
{
|
||
if(bAllow == FALSE)
|
||
{
|
||
SetLocalInt(oPC, ClassToStringInt(nClassType), 1);
|
||
|
||
if(bPermanent == TRUE)
|
||
SetCampaignInt(JX_PRES_DB, ClassToStringInt(nClassType), 1);
|
||
|
||
if(bSendMessage == TRUE)
|
||
SendMessageToPC(oPC, "<c‡‡>Prestige class "+ConvertClassType(nClassType)+"</c> <cé>restricted</c><c‡‡>.</c>");
|
||
|
||
//Override
|
||
if(bOverride == FALSE)
|
||
{
|
||
if(GetLevelByClass(nClassType, oPC) > 0)
|
||
{
|
||
DeleteLocalInt(oPC, ClassToStringInt(nClassType));
|
||
|
||
if(GetCampaignInt(JX_PRES_DB, ClassToStringInt(nClassType), oPC) > 0 && bPermanent == TRUE)
|
||
DeleteCampaignVariable(JX_PRES_DB, ClassToStringInt(nClassType), oPC);
|
||
|
||
if(bSendMessage == TRUE)
|
||
SendMessageToPC(oPC, "<c‡‡>Prestige class "+ConvertClassType(nClassType)+"</c> <cî>unrestricted</c> <c‡‡>because you already have at least one level in this class.</c>");
|
||
}
|
||
}
|
||
//End override
|
||
}
|
||
|
||
else if(bAllow == TRUE)
|
||
{
|
||
if(GetLocalInt(oPC, ClassToStringInt(nClassType)) > 0)
|
||
DeleteLocalInt(oPC, ClassToStringInt(nClassType));
|
||
|
||
if(GetCampaignInt(JX_PRES_DB, ClassToStringInt(nClassType), oPC) > 0 && bPermanent == TRUE)
|
||
DeleteCampaignVariable(JX_PRES_DB, ClassToStringInt(nClassType), oPC);
|
||
|
||
if(bSendMessage == TRUE)
|
||
SendMessageToPC(oPC, "<c‡‡>Prestige class "+ConvertClassType(nClassType)+"</c> <cî>unrestricted</c><c‡‡>.</c>");
|
||
}
|
||
|
||
else
|
||
return;
|
||
}
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////GETABLETOLEVELPRESITGECLASS/////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
int GetAbleToLevelPrestigeClass(object oPC, int nClassType)
|
||
{
|
||
switch(nClassType)
|
||
{
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//------------------------------ARCANE ARCHER---------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_ARCANE_ARCHER:
|
||
//Check to see if the PC has what it takes to be an arcane archer...
|
||
if(GetRacialType(oPC) == RACIAL_TYPE_ELF || GetRacialType(oPC) == RACIAL_TYPE_HALFELF)
|
||
{
|
||
if(GetBaseAttackBonus(oPC) >= 6)
|
||
{
|
||
if(GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW, oPC) ||
|
||
GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW, oPC))
|
||
{
|
||
if(GetHasFeat(FEAT_POINT_BLANK_SHOT, oPC))
|
||
{
|
||
if(GetHasSpellCasting(1, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//---------------------------------ASSASSIN-----------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_ASSASSIN:
|
||
//Check to see if the PC has what it takes to be an assassin...
|
||
if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
|
||
{
|
||
int DexMod = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
|
||
if((GetSkillRank(SKILL_HIDE, oPC)-DexMod) >= 8 && (GetSkillRank(SKILL_MOVE_SILENTLY, oPC)-DexMod) >= 8)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//--------------------------------BLACKGUARD----------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_BLACKGUARD:
|
||
//Check to see if the PC has what it takes to be a blackgaurd...
|
||
if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
|
||
{
|
||
if(GetBaseAttackBonus(oPC) >= 6)
|
||
{
|
||
int DexMod = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
|
||
if((GetSkillRank(SKILL_HIDE, oPC)-DexMod) >= 5)
|
||
{
|
||
if(GetHasFeat(FEAT_CLEAVE, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//-------------------------------CHAMPION OF TORM-----------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_DIVINECHAMPION:
|
||
if(GetAlignmentGoodEvil(oPC)!=ALIGNMENT_EVIL)
|
||
{
|
||
if(GetHasMeleeWeaponFocus(oPC))
|
||
{
|
||
if(GetBaseAttackBonus(oPC)>=7)
|
||
return TRUE;
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//-------------------------------DRAGON DISCIPLE------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_DRAGONDISCIPLE:
|
||
if(GetLevelByClass(CLASS_TYPE_BARD, oPC)>=1 || GetLevelByClass(CLASS_TYPE_SORCERER, oPC)>=1)
|
||
{
|
||
int IntMod = GetAbilityModifier(ABILITY_INTELLIGENCE, oPC);
|
||
if((GetSkillRank(SKILL_LORE, oPC)-IntMod)>=8)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//-------------------------------DWARVEN DEFENDER-----------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_DWARVENDEFENDER:
|
||
if(GetRacialType(oPC)==RACIAL_TYPE_DWARF)
|
||
{
|
||
if(GetBaseAttackBonus(oPC)>=7)
|
||
{
|
||
if(GetHasFeat(FEAT_DODGE,oPC) && GetHasFeat(FEAT_TOUGHNESS,oPC))
|
||
{
|
||
if(GetAlignmentLawChaos(oPC)==ALIGNMENT_LAWFUL)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//-------------------------------HARPER SCOUT---------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_HARPER:
|
||
//Check to see if the PC has what it takes to be a Harper Scout...
|
||
if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD ||
|
||
GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
|
||
{
|
||
if(GetHasFeat(FEAT_ALERTNESS, oPC) && GetHasFeat(FEAT_IRON_WILL, oPC))
|
||
{
|
||
int StrMod = GetAbilityModifier(ABILITY_STRENGTH, oPC);
|
||
int IntMod = GetAbilityModifier(ABILITY_INTELLIGENCE, oPC);
|
||
int ChaMod = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
||
if((GetSkillRank(SKILL_SEARCH, oPC)-IntMod) >= 4 && (GetSkillRank(SKILL_PERSUADE, oPC)-ChaMod) >= 8 && (GetSkillRank(SKILL_LORE, oPC)-IntMod) >= 6 && (GetSkillRank(SKILL_DISCIPLINE, oPC)-StrMod) >= 4)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//--------------------------------PALE MASTER---------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_PALEMASTER:
|
||
if(GetAlignmentGoodEvil(oPC)!=ALIGNMENT_GOOD)
|
||
{
|
||
if(GetHasSpellCasting(3, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//-------------------------------SHADOW DANCER--------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_SHADOWDANCER:
|
||
//Check to see if the PC has what it takes to be a shadow dancer...
|
||
if(GetHasFeat(FEAT_DODGE, oPC) && GetHasFeat(FEAT_MOBILITY, oPC))
|
||
{
|
||
int DexMod = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
|
||
if((GetSkillRank(SKILL_HIDE, oPC)-DexMod) >= 10 && (GetSkillRank(SKILL_MOVE_SILENTLY, oPC)-DexMod) >= 8 && (GetSkillRank(SKILL_TUMBLE, oPC)-DexMod) >= 5)
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//---------------------------------SHIFTER------------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_SHIFTER:
|
||
if(GetHasFeat(FEAT_ALERTNESS, oPC))
|
||
{
|
||
if(GetAbilityScore(oPC, ABILITY_WISDOM)>=13)
|
||
{
|
||
if(GetHasAlternateForm(oPC))
|
||
return TRUE;
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//------------------------------WEAPON MASTER---------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
case CLASS_TYPE_WEAPON_MASTER:
|
||
if(GetBaseAttackBonus(oPC)>=5)
|
||
{
|
||
int ChaMod = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
||
if((GetSkillRank(SKILL_INTIMIDATE, oPC)-ChaMod)>=4)
|
||
{
|
||
if(GetHasMeleeWeaponFocus(oPC))
|
||
{
|
||
if(GetHasFeat(FEAT_DODGE, oPC) &&
|
||
GetHasFeat(FEAT_MOBILITY, oPC) &&
|
||
GetHasFeat(FEAT_EXPERTISE, oPC) &&
|
||
GetHasFeat(FEAT_SPRING_ATTACK, oPC) &&
|
||
GetHasFeat(FEAT_WHIRLWIND_ATTACK, oPC))
|
||
return TRUE;
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
else
|
||
return FALSE;
|
||
|
||
break;
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
//----------------------------------------------------------------------------//
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
default:
|
||
return FALSE;
|
||
break;
|
||
}
|
||
return FALSE;
|
||
}
|
||
//End GetAbleToLevelPrestigeClass
|
||
//------------------------------------------------------------------------------
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////!!!!!!!!!!!!!!!!!!!!!!!END PRESTIGE FUNCTIONS!!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!////
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////
|