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.
165 lines
6.5 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
|
|
} |