Added three starting packages for the Binder class. Updated any PrCs that can advance invokers to allow invocation feats during level up. Updated invoker feats to require Eldritch Blast & DFA Breath where appropriate. Fixed bad constant on Rising Phoenix. Fixed Oozemaster Oozy Touch/Glob bonus feat bug. Vassal of Bahamut's Platinum Armor is now much closer to PnP. Craft (Alchemy) is a class skill for Binders. Moved packages into \Craft2das\ so the PRC8 would continue to build. Updated personal_switch.2da to not stack Power Attack by default. Fixed creature size related screw-up that happened when I was trying to fix unarmed damage for large creatures. +10 Jump bonus for Leaping Dragon Stance was being improperly gated by Blood Claw Master. Fixed duration bug w/ Supress Weapon. Fixed broken loop bug w/ Supress Weapon. Restoration shouldn't be able to remove Crack of Doom user's AB penalty. Epic Vassal's of Bahamut now get their proper allowance. Mirror Images might not spawning in dead anymore. YMMV, Harrowport. Added package TLK worksheet to notes.
306 lines
10 KiB
Plaintext
306 lines
10 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: [Vassal Feats]
|
|
//:: [prc_vassal.nss]
|
|
//:://////////////////////////////////////////////
|
|
//:: Check to see which Vassal of Bahamut lvls a creature
|
|
//:: has and apply the appropriate bonuses.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Zedium
|
|
//:: Created On: April 5, 2005
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_alterations"
|
|
#include "prc_feat_const"
|
|
#include "prc_class_const"
|
|
|
|
void CleanExtraArmors(object oPC)
|
|
{
|
|
// Cleanup routine variables
|
|
object oChk;
|
|
int nArmor8 = 0;
|
|
|
|
// Clean up any extra +8 armors
|
|
oChk = GetFirstItemInInventory(oPC);
|
|
while (GetIsObjectValid(oChk))
|
|
{
|
|
if (GetTag(oChk) == "PlatinumArmor8")
|
|
{
|
|
nArmor8++;
|
|
if (nArmor8 > 1) DestroyObject(oChk, 0.0);
|
|
}
|
|
else if (GetTag(oChk) == "PlatinumArmor4" || GetTag(oChk) == "PlatinumArmor6")
|
|
{
|
|
// Destroy any remaining +4 or +6 armors
|
|
DestroyObject(oChk, 0.0);
|
|
}
|
|
|
|
oChk = GetNextItemInInventory(oPC);
|
|
}
|
|
}
|
|
|
|
/* void CleanExtraArmors(object oPC)
|
|
{
|
|
// Cleanup routine variables
|
|
object oChk;
|
|
int nArmor4 = 0, nArmor6 = 0, nArmor8 = 0;
|
|
|
|
// Clean up any extra armors.
|
|
// This loop counts the armors and destroys any beyond the first one
|
|
oChk = GetFirstItemInInventory(oPC);
|
|
while (GetIsObjectValid(oChk))
|
|
{
|
|
if (GetTag(oChk) == "PlatinumArmor4")
|
|
{
|
|
nArmor4++;
|
|
if (nArmor4 > 1) DestroyObject(oChk, 0.0);
|
|
}
|
|
else if (GetTag(oChk) == "PlatinumArmor6")
|
|
{
|
|
nArmor6++;
|
|
if (nArmor6 > 1) DestroyObject(oChk, 0.0);
|
|
}
|
|
else if (GetTag(oChk) == "PlatinumArmor8")
|
|
{
|
|
nArmor8++;
|
|
if (nArmor8 > 1) DestroyObject(oChk, 0.0);
|
|
}
|
|
|
|
oChk = GetNextItemInInventory(oPC);
|
|
}
|
|
// This loop gets rid of any Platinum Armor +6 and +4 if they have any +8
|
|
if (nArmor8 > 0)
|
|
{
|
|
oChk = GetFirstItemInInventory(oPC);
|
|
while (GetIsObjectValid(oChk))
|
|
{
|
|
if (GetTag(oChk) == "PlatinumArmor6") DestroyObject(oChk, 0.0);
|
|
else if (GetTag(oChk) == "PlatinumArmor4") DestroyObject(oChk, 0.0);
|
|
|
|
oChk = GetNextItemInInventory(oPC);
|
|
}
|
|
}
|
|
// This loop gets rid of any Platinum Armor +4 if they have any +6
|
|
else if (nArmor6 > 0)
|
|
{
|
|
oChk = GetFirstItemInInventory(oPC);
|
|
while (GetIsObjectValid(oChk))
|
|
{
|
|
if (GetTag(oChk) == "PlatinumArmor4") DestroyObject(oChk, 0.0);
|
|
|
|
oChk = GetNextItemInInventory(oPC);
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
void AddArmorOnhit(object oPC,int iEquip)
|
|
{
|
|
object oItem;
|
|
|
|
if(iEquip == 2)
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
|
|
|
if(GetLocalInt(oItem,"Dragonwrack"))
|
|
return;
|
|
|
|
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,1),oItem,999.0);
|
|
SetLocalInt(oItem,"Dragonwrack",1);
|
|
}
|
|
}
|
|
else if(iEquip == 1)
|
|
{
|
|
oItem = GetItemLastUnequipped();
|
|
if(GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
|
|
return;
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,0);
|
|
DeleteLocalInt(oItem,"Dragonwrack");
|
|
}
|
|
else
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
|
if(!GetLocalInt(oItem,"Dragonwrack") && GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,1),oItem,999.0);
|
|
SetLocalInt(oItem,"Dragonwrack",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Dragonwrack (Su): Evil dragons that strike a vassal of Bahamut or
|
|
are struck by him suffer grievous wounds. At 4th level, a vassal
|
|
of Bahamut deals +2d6 points of damage with each successful
|
|
melee attack made against an evil creature of the dragon type.
|
|
Furthermore, any such creature that strikes the vassal with a
|
|
natural weapon or melee weapon takes 1d6 points of damage. */
|
|
|
|
void DWRightWeap(object oPC, int iEquip)
|
|
{
|
|
object oItem;
|
|
|
|
if (iEquip == 2) // Equipping something
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
if (GetLocalInt(oItem, "DWright"))
|
|
return;
|
|
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType != BASE_ITEM_SMALLSHIELD && nType != BASE_ITEM_TOWERSHIELD && nType != BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), oItem, 999.0);
|
|
SetLocalInt(oItem, "DWright", 1);
|
|
}
|
|
}
|
|
else if (iEquip == 1) // Unequipping something
|
|
{
|
|
oItem = GetItemLastUnequipped();
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType == BASE_ITEM_SMALLSHIELD || nType == BASE_ITEM_TOWERSHIELD || nType == BASE_ITEM_LARGESHIELD)
|
|
return;
|
|
|
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0);
|
|
DeleteLocalInt(oItem, "DWright");
|
|
}
|
|
else // Fallback (e.g., login or heartbeat refresh)
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
if (!GetLocalInt(oItem, "DWright"))
|
|
{
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType != BASE_ITEM_SMALLSHIELD && nType != BASE_ITEM_TOWERSHIELD && nType != BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), oItem, 999.0);
|
|
SetLocalInt(oItem, "DWright", 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void DWLeftWeap(object oPC, int iEquip)
|
|
{
|
|
object oItem;
|
|
|
|
if (iEquip == 2) // Equipping something
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
if (GetLocalInt(oItem, "DWleft"))
|
|
return;
|
|
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType != BASE_ITEM_SMALLSHIELD && nType != BASE_ITEM_TOWERSHIELD && nType != BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), oItem, 999.0);
|
|
SetLocalInt(oItem, "DWleft", 1);
|
|
}
|
|
}
|
|
else if (iEquip == 1) // Unequipping something
|
|
{
|
|
oItem = GetItemLastUnequipped();
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType == BASE_ITEM_SMALLSHIELD || nType == BASE_ITEM_TOWERSHIELD || nType == BASE_ITEM_LARGESHIELD)
|
|
return;
|
|
|
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0);
|
|
DeleteLocalInt(oItem, "DWleft");
|
|
}
|
|
else // Fallback (e.g., login or heartbeat refresh)
|
|
{
|
|
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
|
if (!GetIsObjectValid(oItem)) return;
|
|
|
|
if (!GetLocalInt(oItem, "DWleft"))
|
|
{
|
|
int nType = GetBaseItemType(oItem);
|
|
if (nType != BASE_ITEM_SMALLSHIELD && nType != BASE_ITEM_TOWERSHIELD && nType != BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), oItem, 999.0);
|
|
SetLocalInt(oItem, "DWleft", 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* void DWLeftWeap(object oPC,int iEquip)
|
|
{
|
|
object oItem ;
|
|
|
|
if (iEquip==2)
|
|
{
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
if ( GetLocalInt(oItem,"DWleft"))
|
|
return;
|
|
|
|
if (GetBaseItemType(oItem)!=BASE_ITEM_SMALLSHIELD && BASE_ITEM_TOWERSHIELD && BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,1),oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"DWleft",1);
|
|
}
|
|
}
|
|
else if (iEquip==1)
|
|
{
|
|
oItem=GetItemLastUnequipped();
|
|
if (GetBaseItemType(oItem)==BASE_ITEM_SMALLSHIELD || BASE_ITEM_TOWERSHIELD || BASE_ITEM_LARGESHIELD) return;
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,0);
|
|
DeleteLocalInt(oItem,"DWleft");
|
|
}
|
|
else
|
|
{
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
if ( !GetLocalInt(oItem,"DWleft")&& GetBaseItemType(oItem)!=BASE_ITEM_SMALLSHIELD && BASE_ITEM_TOWERSHIELD && BASE_ITEM_LARGESHIELD)
|
|
{
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,1),oItem,9999.0);
|
|
SetLocalInt(oItem,"DWleft",1);
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
void ImperiousAura(object oPC, object oSkin, int iLevel)
|
|
{
|
|
if(GetLocalInt(oSkin, "ImperiousAura") == iLevel) return;
|
|
|
|
SetCompositeBonus(oSkin, "ImperiousAuraA", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_APPRAISE);
|
|
SetCompositeBonus(oSkin, "ImperiousAuraP", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERFORM);
|
|
SetCompositeBonus(oSkin, "ImperiousAuraPe", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_PERSUADE);
|
|
SetCompositeBonus(oSkin, "ImperiousAuraT", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_SENSE_MOTIVE);
|
|
SetCompositeBonus(oSkin, "ImperiousAuraB", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_BLUFF);
|
|
SetCompositeBonus(oSkin, "ImperiousAuraI", iLevel, ITEM_PROPERTY_SKILL_BONUS, SKILL_INTIMIDATE);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
object oSkin = GetPCSkin(oPC);
|
|
int nVassal = GetLevelByClass(CLASS_TYPE_VASSAL, oPC);
|
|
int iEquip = GetLocalInt(oPC, "ONEQUIP");
|
|
|
|
//Imperious Aura
|
|
if(nVassal) ImperiousAura(oPC, oSkin, (nVassal+1)/2);
|
|
|
|
// *Level 4
|
|
//Dragonwrack
|
|
if(nVassal >= 4)
|
|
{
|
|
AddArmorOnhit(oPC, iEquip);
|
|
DWRightWeap(oPC, iEquip);
|
|
DWLeftWeap(oPC, iEquip);
|
|
}
|
|
|
|
// Clean up any extra armors
|
|
DelayCommand(3.0, CleanExtraArmors(oPC));
|
|
} |