PRC8/nwn/nwnprc/trunk/scripts/prc_foe_hntr.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

165 lines
6.5 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Foe Hunter
//:://////////////////////////////////////////////
/*
Script for Foe Hunter
*/
//:://////////////////////////////////////////////
//:: Created By: Oni5115
//:: Created On: Mar 17, 2004
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "prc_feat_const"
#include "prc_class_const"
#include "prc_spell_const"
// Stores hated foe as a local int
void SetHatedEnemyRace(object oPC)
{
int hatedEnemy = 0;
if( GetHasFeat(FEAT_HATED_ENEMY_DWARF, oPC) ) hatedEnemy = RACIAL_TYPE_DWARF;
else if(GetHasFeat(FEAT_HATED_ENEMY_ELF, oPC)) hatedEnemy = RACIAL_TYPE_ELF;
else if(GetHasFeat(FEAT_HATED_ENEMY_GNOME, oPC)) hatedEnemy = RACIAL_TYPE_GNOME;
else if(GetHasFeat(FEAT_HATED_ENEMY_HALFLING, oPC)) hatedEnemy = RACIAL_TYPE_HALFLING;
else if(GetHasFeat(FEAT_HATED_ENEMY_HALFELF, oPC)) hatedEnemy = RACIAL_TYPE_HALFELF;
else if(GetHasFeat(FEAT_HATED_ENEMY_HALFORC, oPC)) hatedEnemy = RACIAL_TYPE_HALFORC;
else if(GetHasFeat(FEAT_HATED_ENEMY_HUMAN, oPC)) hatedEnemy = RACIAL_TYPE_HUMAN;
else if(GetHasFeat(FEAT_HATED_ENEMY_ABERRATION, oPC)) hatedEnemy = RACIAL_TYPE_ABERRATION;
else if(GetHasFeat(FEAT_HATED_ENEMY_ANIMAL, oPC)) hatedEnemy = RACIAL_TYPE_ANIMAL;
else if(GetHasFeat(FEAT_HATED_ENEMY_BEAST, oPC)) hatedEnemy = RACIAL_TYPE_BEAST;
else if(GetHasFeat(FEAT_HATED_ENEMY_CONSTRUCT, oPC)) hatedEnemy = RACIAL_TYPE_CONSTRUCT;
else if(GetHasFeat(FEAT_HATED_ENEMY_DRAGON, oPC)) hatedEnemy = RACIAL_TYPE_DRAGON;
else if(GetHasFeat(FEAT_HATED_ENEMY_GOBLINOID, oPC)) hatedEnemy = RACIAL_TYPE_HUMANOID_GOBLINOID;
else if(GetHasFeat(FEAT_HATED_ENEMY_MONSTROUS, oPC)) hatedEnemy = RACIAL_TYPE_HUMANOID_MONSTROUS;
else if(GetHasFeat(FEAT_HATED_ENEMY_ORC, oPC)) hatedEnemy = RACIAL_TYPE_HUMANOID_ORC;
else if(GetHasFeat(FEAT_HATED_ENEMY_REPTILIAN, oPC)) hatedEnemy = RACIAL_TYPE_HUMANOID_REPTILIAN;
else if(GetHasFeat(FEAT_HATED_ENEMY_ELEMENTAL, oPC)) hatedEnemy = RACIAL_TYPE_ELEMENTAL;
else if(GetHasFeat(FEAT_HATED_ENEMY_FEY, oPC)) hatedEnemy = RACIAL_TYPE_FEY;
else if(GetHasFeat(FEAT_HATED_ENEMY_GIANT, oPC)) hatedEnemy = RACIAL_TYPE_GIANT;
else if(GetHasFeat(FEAT_HATED_ENEMY_MAGICAL_BEAST, oPC)) hatedEnemy = RACIAL_TYPE_MAGICAL_BEAST;
else if(GetHasFeat(FEAT_HATED_ENEMY_OUTSIDER, oPC)) hatedEnemy = RACIAL_TYPE_OUTSIDER;
else if(GetHasFeat(FEAT_HATED_ENEMY_SHAPECHANGER, oPC)) hatedEnemy = RACIAL_TYPE_SHAPECHANGER;
else if(GetHasFeat(FEAT_HATED_ENEMY_UNDEAD, oPC)) hatedEnemy = RACIAL_TYPE_UNDEAD;
else if(GetHasFeat(FEAT_HATED_ENEMY_VERMIN, oPC)) hatedEnemy = RACIAL_TYPE_VERMIN;
else if(GetHasFeat(FEAT_HATED_ENEMY_OOZE, oPC)) hatedEnemy = RACIAL_TYPE_OOZE;
else if(GetHasFeat(FEAT_HATED_ENEMY_PLANT, oPC)) hatedEnemy = RACIAL_TYPE_PLANT;
SetLocalInt(oPC, "HatedFoe", hatedEnemy);
}
// Stored DR in a local int
void SetHatedFoeDR(object oPC)
{
int iFHLevel = GetLevelByClass(CLASS_TYPE_FOE_HUNTER, oPC);
int iDR = iFHLevel;
// if the level is even then DR = FH level +1
if( (iFHLevel%2) == 0)
{
iDR += 1;
}
SetLocalInt(oPC, "HatedFoeDR", iDR);
}
void ApplyFoeHunterRancor(object oPC, object oWeapon)
{
IPSafeAddItemProperty(oWeapon, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 9999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
SetLocalInt(oPC, "HasFHRancor", 2);
}
void RemoveFoeHunterRancor(object oPC, object oWeapon)
{
RemoveSpecificProperty(oWeapon, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", 1, DURATION_TYPE_TEMPORARY);
SetLocalInt(oPC, "HasFHRancor", 1);
}
void ApplyFoeHunterDR(object oPC, object oArmor)
{
IPSafeAddItemProperty(oArmor, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 9999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
SetLocalInt(oPC, "HasFHDR", 2);
}
void RemoveFoeHunterDR(object oPC, object oArmor)
{
RemoveSpecificProperty(oArmor, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", 1, DURATION_TYPE_TEMPORARY);
SetLocalInt(oPC, "HasFHDR", 1);
}
void main()
{
object oPC = OBJECT_SELF;
// Stores the values in a local int for use in on-hit script
// prevents the checks from having to run every time player get's hit
// saving a lot of CPU cylces
SetHatedEnemyRace(oPC);
SetHatedFoeDR(oPC);
object oItem;
int iEquip = GetLocalInt(oPC, "ONEQUIP");
int iHasFHDR = GetLocalInt(oPC, "HasFHDR");
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
object oWeaponR = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
// On error - Typically when first entering a module
if(GetHasFeat(FEAT_HATED_ENEMY_DR) && iHasFHDR == 0)
{
RemoveFoeHunterDR(oPC, oArmor);
ApplyFoeHunterDR(oPC, oArmor);
RemoveFoeHunterRancor(oPC, oWeaponR);
ApplyFoeHunterRancor(oPC, oWeaponR);
}
else if(GetHasFeat(FEAT_HATED_ENEMY_DR) && iHasFHDR != 0)
{
if(iEquip == 2) // On Equip
{
// add bonus to armor
oItem = GetItemLastEquipped();
if(oItem == oArmor)
{
ApplyFoeHunterDR(oPC, oArmor);
}
ApplyFoeHunterRancor(oPC, oWeaponR);
if(GetWeaponRanged(oWeaponR))
{
object oAmmo;
oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
ApplyFoeHunterRancor(oPC, oAmmo);
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC);
ApplyFoeHunterRancor(oPC, oAmmo);
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
ApplyFoeHunterRancor(oPC, oAmmo);
}
}
else if(iEquip == 1) // Unequip
{
oItem = GetItemLastUnequipped();
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
{
RemoveFoeHunterDR(oPC, oItem);
}
else
{
RemoveFoeHunterRancor(oPC, oItem);
}
}
else // On level, rest, or other events
{
RemoveFoeHunterDR(oPC, oArmor);
ApplyFoeHunterDR(oPC, oArmor);
}
}
}