generated from Jaysyn/ModuleTemplate
Initial commit
Initial commit
This commit is contained in:
174
_module/nss/xp_opw_system.nss
Normal file
174
_module/nss/xp_opw_system.nss
Normal file
@@ -0,0 +1,174 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Olander's PW XP System
|
||||
// xp_opw_system
|
||||
// by Don Anderson
|
||||
//
|
||||
// Original Script by Brian Kittrell
|
||||
//
|
||||
/*
|
||||
- Minimum XP Per Kill
|
||||
- Maximum XP Per Kill
|
||||
- Kill Bonus to Killer
|
||||
- Party Bonus
|
||||
- Players above Maximum Level Difference to Lowest Level are Thrown out
|
||||
- Maximum Level Cap to Give XP (The Level Set still gets XP)
|
||||
*/
|
||||
//
|
||||
// This pretty much puts an end to power levelling but
|
||||
// still allows low and high levels to travel together
|
||||
// and work together as a team.
|
||||
//
|
||||
// This also penalizes for killing Commoners too
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//SET THE EXPERIENCE VALUES HERE
|
||||
|
||||
// This is the minimum amount of experience that is given
|
||||
// to each player. Set this to be as aggressive or slow
|
||||
// as needed to achieve a good result.
|
||||
// NOTE: This has the effect of levelling quickly in the
|
||||
// lower levels and naturally slowing down in the
|
||||
// higher levels.
|
||||
int nNXP = 0;
|
||||
|
||||
// This is the Bonus Received for the Kill
|
||||
int nKXP = 10;
|
||||
|
||||
// This is the RATE that determines party bonus. Adjust this
|
||||
// as necessary to get the disired result.
|
||||
// This is calculated to the CR of the creature Killed
|
||||
int nBXP = 20;
|
||||
|
||||
//This is the Maximum XP for ANY Creature in a Module
|
||||
int nMXP = 200;
|
||||
|
||||
//Maximum Level Difference from Highest to Lowest Level
|
||||
//Set to 40 To Basically Disable
|
||||
int nMLD = 40;
|
||||
|
||||
//Maximum Level to Give XP
|
||||
int nMLXP = 40;
|
||||
|
||||
void main()
|
||||
{
|
||||
int nCommoner = GetLevelByClass(CLASS_TYPE_COMMONER);
|
||||
int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
|
||||
object oKiller = GetLastKiller();
|
||||
object oMember;
|
||||
int nMember = 0;
|
||||
int nLLevel = 40;
|
||||
int nNParty = 0;
|
||||
int nLParty = 0;
|
||||
int nBFValue = 0;
|
||||
int nFMValue;
|
||||
|
||||
// Check if the PC killed a Commoner
|
||||
// If YES shift 5 points towards Evil
|
||||
if (GetIsPC(oKiller) || GetIsPC(GetMaster(oKiller)))
|
||||
{
|
||||
int nCommoner = GetLevelByClass(CLASS_TYPE_COMMONER);
|
||||
int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
|
||||
if(nCommoner > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL || nAlign == ALIGNMENT_EVIL ))
|
||||
{
|
||||
RemoveFromParty(oKiller);
|
||||
AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
|
||||
}
|
||||
|
||||
//Now we calculate the total CR Bonus XP
|
||||
float fCRBonusXP = GetChallengeRating(OBJECT_SELF);
|
||||
int nCRBonusXP = FloatToInt(fCRBonusXP);
|
||||
|
||||
//First We need the Lowest Level Player
|
||||
oMember = GetFirstFactionMember(oKiller, TRUE);
|
||||
while(GetIsObjectValid(oMember))
|
||||
{
|
||||
if (GetArea(OBJECT_SELF) == GetArea(oMember))
|
||||
{
|
||||
nMember = GetHitDice(oMember);
|
||||
if(nMember < nLLevel) nLLevel = nMember;
|
||||
}
|
||||
oMember = GetNextFactionMember(oKiller, TRUE);
|
||||
}
|
||||
|
||||
//All party members in the area of the kill will get XP Unless Outside of Range
|
||||
oMember = GetFirstFactionMember(oKiller, TRUE);
|
||||
while(GetIsObjectValid(oMember))
|
||||
{
|
||||
if (GetArea(OBJECT_SELF) == GetArea(oMember))
|
||||
{
|
||||
nMember = GetHitDice(oMember);
|
||||
nNParty++;
|
||||
if(nMember <= (nMLD + nLLevel))
|
||||
{
|
||||
nLParty += nMember;
|
||||
SetLocalInt(oMember,"XP_ELIGIBLE",1);
|
||||
}
|
||||
}
|
||||
oMember = GetNextFactionMember(oKiller, TRUE);
|
||||
}
|
||||
|
||||
//Now we set the Average Party Level
|
||||
if(nNParty <= 0) nNParty = 1;
|
||||
int nAVGParty = nLParty / nNParty;
|
||||
if(nAVGParty <= 0) nAVGParty = 1;
|
||||
|
||||
//Now we split the Bonus between all party members
|
||||
int nBonusXP;// = nCRBonusXP / nAVGParty;
|
||||
|
||||
int nDifferenceCR = nCRBonusXP - nAVGParty;
|
||||
|
||||
if (nDifferenceCR < -10) nDifferenceCR = -10;
|
||||
if (nDifferenceCR > 5) nDifferenceCR = 5;
|
||||
|
||||
nDifferenceCR = nDifferenceCR + 11;
|
||||
if (nDifferenceCR < 11)
|
||||
{
|
||||
nBonusXP = nDifferenceCR * 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
nDifferenceCR = nDifferenceCR - 11;
|
||||
nBonusXP = 100 + nDifferenceCR * 20;
|
||||
}
|
||||
//Now we set the Bonus to 0 of more
|
||||
if (nBonusXP > 0)
|
||||
{
|
||||
nBFValue = nBonusXP;
|
||||
}
|
||||
|
||||
//This is the Final Total Experience Given to each Player
|
||||
int nFinalXP = nNXP + nBFValue;
|
||||
//if(nFinalXP > nMXP) nFinalXP = nMXP;
|
||||
nNParty = nNParty - 1;
|
||||
if (nNParty > 5) nNParty = 5;
|
||||
int nPartyBonus = nNParty * 10;
|
||||
nFinalXP = nFinalXP + nPartyBonus;
|
||||
nFinalXP = nFinalXP + GetLocalInt(OBJECT_SELF, "nBonusXP");
|
||||
|
||||
//Now we give XP to all in the Party
|
||||
oMember = GetFirstFactionMember(oKiller, TRUE);
|
||||
int nXPE;
|
||||
while (GetIsObjectValid(oMember))
|
||||
{
|
||||
if (GetArea(OBJECT_SELF) == GetArea(oMember))
|
||||
{
|
||||
nXPE = GetLocalInt(oMember,"XP_ELIGIBLE");
|
||||
nMember = GetHitDice(oMember);
|
||||
if(nXPE == 1 && nMember <= nMLXP)
|
||||
{
|
||||
//The Killer gets the Kill Bonus
|
||||
if(oMember == oKiller) nFinalXP = nFinalXP + nKXP;
|
||||
GiveXPToCreature(oMember, nFinalXP);
|
||||
}
|
||||
}
|
||||
oMember = GetNextFactionMember(oKiller, TRUE);
|
||||
}
|
||||
|
||||
int nMaxHP = GetMaxHitPoints(OBJECT_SELF);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nMaxHP), OBJECT_SELF);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user