Fixed CCOH, Fixed starting GP, Fixed DMFI languages, Fix cep weapon appearances, Fixed new player start up system. Added PC deleter. Added ACP 4.1. Full compile. Updated release archive.
139 lines
4.7 KiB
Plaintext
139 lines
4.7 KiB
Plaintext
#include "NW_I0_GENERIC"
|
|
void RespawnObject(string sResRef, int iType, location lLoc) {
|
|
CreateObject(iType, sResRef, lLoc);
|
|
}
|
|
//void Create(int nCreature, string sSelf, location lDeath)
|
|
//{
|
|
//CreateObject(OBJECT_TYPE_CREATURE, GetTag(OBJECT_SELF), GetLocation(OBJECT_SELF), FALSE);
|
|
//}
|
|
|
|
void main()
|
|
{
|
|
ExecuteScript("prc_npc_death", OBJECT_SELF);
|
|
|
|
string sResRef = GetResRef(OBJECT_SELF);
|
|
int iType = GetObjectType(OBJECT_SELF);
|
|
// For creatures, save the location at spawn-time as a local location and
|
|
// use it instead. Otherwise, the creature will respawn where it died.
|
|
// No changes are required for placeables as they do not move (usually ;-)
|
|
location lLoc =GetLocation(OBJECT_SELF);
|
|
float fDelay = 60.0; // 5 minute delay; adjust as desired
|
|
AssignCommand(GetModule(), DelayCommand(fDelay, RespawnObject(sResRef, iType, lLoc)));
|
|
//DelayCommand(180.0f, Create(OBJECT_TYPE_CREATURE, GetTag(OBJECT_SELF), GetLocation(OBJECT_SELF)));
|
|
//SetIsDestroyable(TRUE, TRUE, FALSE);
|
|
//DestroyObject(OBJECT_SELF);
|
|
|
|
object oKiller = GetLastKiller();
|
|
int noleech = 0;
|
|
int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
|
|
int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
|
|
if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
|
|
{
|
|
AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
|
|
}
|
|
SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);
|
|
//Shout Attack my target, only works with the On Spawn In setup
|
|
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
|
|
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
|
|
{
|
|
SignalEvent(OBJECT_SELF, EventUserDefined(1007));
|
|
}
|
|
float BaseEXP = ((GetChallengeRating(OBJECT_SELF)*3.0)+5);
|
|
float BonusEXP = GetChallengeRating(OBJECT_SELF)+5;
|
|
float BaseMonEXP = BaseEXP;
|
|
int NumOfParty = 0;
|
|
float PartyLevelSum = 0.0;
|
|
object oPartyMember = GetFirstFactionMember(oKiller, TRUE);
|
|
while(GetIsObjectValid(oPartyMember)) {
|
|
if (GetArea(OBJECT_SELF) == GetArea(oPartyMember))
|
|
{
|
|
int leech = GetHitDice(oPartyMember);
|
|
if (leech >= noleech){
|
|
noleech = leech;
|
|
}
|
|
NumOfParty++;
|
|
PartyLevelSum += GetCharacterLevel(oPartyMember);
|
|
}
|
|
oPartyMember = GetNextFactionMember(oKiller, TRUE);
|
|
}
|
|
if (PartyLevelSum <= 1.0)
|
|
{
|
|
PartyLevelSum = 1.0;
|
|
}
|
|
if (NumOfParty <= 1)
|
|
{
|
|
NumOfParty = 1;
|
|
}
|
|
float PartyAvgLvl = PartyLevelSum / NumOfParty;
|
|
//Calculate Adjustment Value
|
|
if (PartyAvgLvl <= 1.0)
|
|
{
|
|
PartyAvgLvl = 1.0;
|
|
}
|
|
float x = GetChallengeRating(OBJECT_SELF);
|
|
if (x <= 1.0)
|
|
{
|
|
x = 1.0;
|
|
}
|
|
float z = (x / PartyAvgLvl);
|
|
float AdjustValue = ((z+2)/3);
|
|
float FinalMonValue;
|
|
//Determine Final Experience Value
|
|
if (AdjustValue == 0.0) {
|
|
FinalMonValue = BaseMonEXP;
|
|
} else {
|
|
if (AdjustValue < 1.0) {
|
|
FinalMonValue = BaseMonEXP * AdjustValue;
|
|
} else {
|
|
FinalMonValue = BaseMonEXP + (BonusEXP * (AdjustValue * (1.10)));
|
|
}
|
|
}
|
|
//Determine the value of the Split EXP
|
|
if (NumOfParty >= 6)
|
|
{
|
|
NumOfParty = 5;
|
|
}
|
|
if (NumOfParty <= 1)
|
|
{
|
|
NumOfParty = 1;
|
|
}
|
|
if (FinalMonValue <= 1.0)
|
|
{
|
|
FinalMonValue = 1.0;
|
|
}
|
|
float SplitFinalEXP = FinalMonValue / NumOfParty;
|
|
if (SplitFinalEXP <= 1.0)
|
|
{
|
|
SplitFinalEXP = 1.0;
|
|
}
|
|
float y = (FinalMonValue - SplitFinalEXP);
|
|
if (y <= 1.0)
|
|
{
|
|
y = 1.0;
|
|
}
|
|
if (PartyAvgLvl >= 15.0)
|
|
{
|
|
FinalMonValue = FinalMonValue - ( PartyAvgLvl);
|
|
}
|
|
float PartyBonus = ((y +1)/ 1.75) + (FinalMonValue + ((21-PartyAvgLvl)/3));
|
|
int SFEint = FloatToInt(PartyBonus);
|
|
//Distribute EXP to all PCs in the Party
|
|
oPartyMember = GetFirstFactionMember(oKiller, TRUE);
|
|
while (GetIsObjectValid(oPartyMember)) {
|
|
if (GetArea(OBJECT_SELF) == GetArea(oPartyMember)) {
|
|
int nHD = GetHitDice(oPartyMember) + 1;
|
|
int nMax = (((nHD * (nHD - 1)) / 2) * 1000)+1;
|
|
if (nMax <= GetXP(oPartyMember) && nHD <= 40) {
|
|
SendMessageToPC(oPartyMember, "You cannot gain experience until you have leveled.");
|
|
} else if (GetIsDead(oPartyMember)) {
|
|
SendMessageToPC(oPartyMember, "You cannot gain experience while dead. Your XP has been reset.");
|
|
} else if ((GetHitDice(oPartyMember)) <= (noleech - 7) || (GetHitDice(oPartyMember)) >= FloatToInt(PartyAvgLvl) + 7) {
|
|
SendMessageToPC(oPartyMember, "All party members must be within 6 levels of each other.");
|
|
} else {
|
|
GiveXPToCreature(oPartyMember, SFEint);
|
|
}
|
|
}
|
|
oPartyMember = GetNextFactionMember(oKiller, TRUE);
|
|
}
|
|
}
|