Fixed Sigmata radials. Added spiritual weapon sanity checks. Forsaker & Vow of Poverty fixes by @Fencas. Updated Saint template. Fixed minor TLK updates. Updated release archive.
1108 lines
61 KiB
Plaintext
1108 lines
61 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: [Spiritual Weapon]
|
|
//:: [inc_spirit_weapn.nss]
|
|
//:: [Jaysyn 2024-08-23 07:58:14]
|
|
//::
|
|
//:: Include script for Spiritual Weapon
|
|
//::
|
|
//::///////////////////////////////////////////////
|
|
/**@ Spiritual Weapon
|
|
(Player's Handbook v.3.5, p. 283)
|
|
|
|
Evocation [Force]
|
|
Level: Cleric 2, Knight of the Chalice 2, War 2, Mysticism 2,
|
|
Components: V, S, DF,
|
|
Casting Time: 1 standard action
|
|
Range: Medium (100 ft. + 10 ft./level)
|
|
Effect: Magic weapon of force
|
|
Duration: 1 round/level (D)
|
|
Saving Throw: None
|
|
Spell Resistance: Yes
|
|
|
|
A weapon made of pure force springs into existence and attacks
|
|
opponents at a distance, as you direct it, dealing 1d8 force
|
|
damage per hit, +1 point per three caster levels (maximum +5
|
|
at 15th level). The weapon takes the shape of a weapon
|
|
favored by your deity or a weapon with some spiritual
|
|
significance or symbolism to you (see below) and has the
|
|
same threat range and critical multipliers as a real weapon
|
|
of its form. It strikes the opponent you designate, starting
|
|
with one attack in the round the spell is cast and continuing
|
|
each round thereafter on your turn. It uses your base attack
|
|
bonus (possibly allowing it multiple attacks per round in
|
|
subsequent rounds) plus your Wisdom modifier as its attack
|
|
bonus. It strikes as a spell, not as a weapon, so, for
|
|
example, it can damage creatures that have damage
|
|
reduction. As a force effect, it can strike incorporeal
|
|
creatures without the normal miss chance associated with
|
|
incorporeality. The weapon always strikes from your
|
|
direction. It does not get a flanking bonus or help a
|
|
combatant get one. Your feats (such as Weapon Focus)
|
|
or combat actions (such as charge) do not affect the
|
|
weapon. If the weapon goes beyond the spell range, if
|
|
it goes out of your sight, or if you are not directing
|
|
it, the weapon returns to you and hovers.
|
|
|
|
Each round after the first, you can use a move action to
|
|
redirect the weapon to a new target. If you do not,
|
|
the weapon continues to attack the previous round's
|
|
target. On any round that the weapon switches targets,
|
|
it gets one attack. Subsequent rounds of attacking that
|
|
target allow the weapon to make multiple attacks if your
|
|
base attack bonus would allow it to. Even if the spiritual
|
|
weapon is a ranged weapon, use the spell's range, not the
|
|
weapon's normal range increment, and switching targets
|
|
still is a move action.
|
|
|
|
A spiritual weapon cannot be attacked or harmed by
|
|
physical attacks, but dispel magic, disintegrate, a
|
|
sphere of annihilation, or a rod of cancellation affects it.
|
|
A spiritual weapon's AC against touch attacks is 12 (10 +
|
|
size bonus for Tiny object).
|
|
|
|
If an attacked creature has spell resistance, you make a
|
|
caster level check (1d20 + caster level) against that
|
|
spell resistance the first time the spiritual weapon
|
|
strikes it. If the weapon is successfully resisted, the
|
|
spell is dispelled. If not, the weapon has its normal
|
|
full effect on that creature for the duration of the spell.
|
|
*///////////////////////////////////////////////////////////
|
|
#include "inc_rand_equip"
|
|
#include "prc_inc_spells"
|
|
|
|
|
|
void NullifyAppearance(object oSummon, int nThrowHands = FALSE)
|
|
{
|
|
// Ensure the object is valid and is not a player or DM
|
|
if (!GetIsObjectValid(oSummon) || GetIsPC(oSummon) || GetIsDM(oSummon))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Nullify all body parts
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_TORSO, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_BELT, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_PELVIS, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_THIGH, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_THIGH, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_FOOT, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_FOOT, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_FOREARM, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_FOREARM, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_HAND, 0, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_HAND, 0, oSummon);
|
|
|
|
if(nThrowHands)
|
|
{
|
|
// Keep hands and forearms visible
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_FOREARM, 1, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_FOREARM, 1, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_RIGHT_HAND, 1, oSummon);
|
|
SetCreatureBodyPart(CREATURE_PART_LEFT_HAND, 1, oSummon);
|
|
}
|
|
}
|
|
|
|
void RegisterSummonEvents(object oCreature)
|
|
{
|
|
// Explicitly re-register the event for the next spell cast at the summon.
|
|
AddEventScript(oCreature, EVENT_NPC_ONSPELLCASTAT, "sp_spiritweapon", TRUE);
|
|
AddEventScript(oCreature, EVENT_NPC_ONSPELLCASTAT, "sp_spiritweapon", TRUE);
|
|
SendMessageToPC(GetFirstPC(), "inc_spirit_weapn: Event re-registered for next spell cast.");
|
|
}
|
|
|
|
// Returns the alignment component with the most points towards it.
|
|
// Possible returns: ALIGNMENT_LAWFUL, ALIGNMENT_CHAOTIC, ALIGNMENT_GOOD, ALIGNMENT_EVIL, or ALIGNMENT_NEUTRAL.
|
|
int GetDominantAlignment(object oCreature)
|
|
{
|
|
int nLawChaos = GetLawChaosValue(oCreature);
|
|
int nGoodEvil = GetGoodEvilValue(oCreature);
|
|
|
|
int nDominant = ALIGNMENT_NEUTRAL;
|
|
|
|
// Check Law vs Chaos
|
|
if (nLawChaos > 50)
|
|
{
|
|
nDominant = ALIGNMENT_LAWFUL;
|
|
}
|
|
else if (nLawChaos < 50)
|
|
{
|
|
nDominant = ALIGNMENT_CHAOTIC;
|
|
}
|
|
|
|
// Check Good vs Evil
|
|
if (nGoodEvil > 50)
|
|
{
|
|
if (nLawChaos == 50 || nGoodEvil > nLawChaos) // Tie or Good is stronger
|
|
{
|
|
nDominant = ALIGNMENT_GOOD;
|
|
}
|
|
}
|
|
else if (nGoodEvil < 50)
|
|
{
|
|
if (nLawChaos == 50 || nGoodEvil < nLawChaos) // Tie or Evil is stronger
|
|
{
|
|
nDominant = ALIGNMENT_EVIL;
|
|
}
|
|
}
|
|
|
|
return nDominant;
|
|
}
|
|
|
|
void SetDeityByClass(object oCreature)
|
|
{
|
|
if(GetLevelByClass(CLASS_TYPE_RAVAGER, oCreature) > 0) SetDeity(oCreature, "Erythnul");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_TEMPUS, oCreature) > 0) SetDeity(oCreature, "Tempus");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_BLACK_BLOOD_CULTIST, oCreature) > 0) SetDeity(oCreature, "Malar");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_CELEBRANT_SHARESS, oCreature) > 0) SetDeity(oCreature, "Sharess");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_COC, oCreature) > 0) SetDeity(oCreature, "Corellon Larethian");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_VASSAL, oCreature) > 0) SetDeity(oCreature, "Bahamut");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_ORCUS, oCreature) > 0 ) SetDeity(oCreature, "Orcus");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCreature) > 0 ) SetDeity(oCreature, "Talona");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_STORMLORD, oCreature) > 0 ) SetDeity(oCreature, "Talos");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCreature) > 0 ) SetDeity(oCreature, "Tiamat");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_SOLDIER_OF_LIGHT, oCreature) > 0 ) SetDeity(oCreature, "Elishar");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_SLAYER_OF_DOMIEL, oCreature) > 0 ) SetDeity(oCreature, "Domiel");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCreature) > 0 ) SetDeity(oCreature, "Heironeous");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCreature) > 0 ) SetDeity(oCreature, "Wee Jas");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCreature) > 0 ) SetDeity(oCreature, "Lathander");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCreature) > 0 ) SetDeity(oCreature, "Kord");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCreature) > 0 ) SetDeity(oCreature, "Sune");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_HEXTOR, oCreature) > 0 ) SetDeity(oCreature, "Hextor");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_PRC_EYE_OF_GRUUMSH, oCreature) > 0 ) SetDeity(oCreature, "Gruumsh");
|
|
|
|
//if(GetLevelByClass(CLASS_TYPE_JUDICATOR, oCreature) > 0 ) SetDeity(oCreature, "Selvetarm");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_JUDICATOR, oCreature) > 0 ) SetDeity(oCreature, "Lolth");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_OCULAR, oCreature) > 0 ) SetDeity(oCreature, "Great Mother");
|
|
|
|
if(GetLevelByClass(CLASS_TYPE_KNIGHT_WEAVE, oCreature) > 0 ) SetDeity(oCreature, "Mystra");
|
|
}
|
|
|
|
string GetSpiritualWeaponTypeByDeity(object oCreature)
|
|
{
|
|
SetDeityByClass(oCreature);
|
|
|
|
string sDeity = GetStringLowerCase(GetDeity(oCreature));
|
|
string sResRef;
|
|
|
|
int nDomAlignment = GetDominantAlignment(oCreature);
|
|
|
|
if(GetStringRight(sDeity, 12) == GetStringLowerCase("glittergold") || GetStringRight(sDeity, 5) == GetStringLowerCase("auril")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("balinor") || GetStringRight(sDeity, 11) == GetStringLowerCase("smoothhands")
|
|
|| GetStringRight(sDeity, 11) == GetStringLowerCase("silverbeard") || GetStringRight(sDeity, 6) == GetStringLowerCase("duerra")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("gulthyn") || GetStringRight(sDeity, 8) == GetStringLowerCase("iallanis")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("llerg") || GetStringRight(sDeity, 10) == GetStringLowerCase("maglubiyet")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("tempus") || GetStringRight(sDeity, 6) == GetStringLowerCase("uthgar")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("valkar") || GetStringRight(sDeity, 5) == GetStringLowerCase("vatun"))
|
|
sResRef = "nw_waxbt001"; //:: Battleaxe
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("boccob") || GetStringRight(sDeity, 10) == GetStringLowerCase("fharlanghn")
|
|
|| GetStringRight(sDeity, 3) == GetStringLowerCase("hai") || GetStringRight(sDeity, 6) == GetStringLowerCase("faenya")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("aureon") || GetStringRight(sDeity, 5) == GetStringLowerCase("azuth")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("bralm") || GetStringRight(sDeity, 11) == GetStringLowerCase("cyrrollalee")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("liothiel") || GetStringRight(sDeity, 9) == GetStringLowerCase("incabulos")
|
|
|| GetStringRight(sDeity, 3) == GetStringLowerCase("geb") || GetStringRight(sDeity, 7) == GetStringLowerCase("enoreth")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("joramy") || GetStringRight(sDeity, 9) == GetStringLowerCase("panzuriel")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("rallathil") || GetStringRight(sDeity, 7) == GetStringLowerCase("pholtus")
|
|
|| GetStringRight(sDeity, 3) == GetStringLowerCase("hai") || GetStringRight(sDeity, 10) == GetStringLowerCase("fharlanghn")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("moonbow") || GetStringRight(sDeity, 8) == GetStringLowerCase("shiallia")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("solanil") || GetStringRight(sDeity, 7) == GetStringLowerCase("tarmuid")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("shadow") || GetStringRight(sDeity, 5) == GetStringLowerCase("thoth")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("velsharoon") || GetStringRight(sDeity, 7) == GetStringLowerCase("ventila"))
|
|
sResRef = "nw_wdbqs001"; //:: Quarterstaff
|
|
|
|
else if(GetStringRight(sDeity, 9) == GetStringLowerCase("larethian") || GetStringRight(sDeity, 7) == GetStringLowerCase("ehlonna")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("heironeous") || GetStringRight(sDeity, 5) == GetStringLowerCase("altua")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("barachiel") || GetStringRight(sDeity, 10) == GetStringLowerCase("heironeous")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("cyric") || GetStringRight(sDeity, 4) == GetStringLowerCase("dorn")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("garagos") || GetStringRight(sDeity, 7) == GetStringLowerCase("glautru")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("ilneval") || GetStringRight(sDeity, 6) == GetStringLowerCase("lendys")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("mask") || GetStringRight(sDeity, 10) == GetStringLowerCase("merrshaulk")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("oghma") || GetStringRight(sDeity, 8) == GetStringLowerCase("pyremius")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("red knight") || GetStringRight(sDeity, 3) == GetStringLowerCase("tyr")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("vergadain") || GetStringRight(sDeity, 7) == GetStringLowerCase("elishar"))
|
|
sResRef = "nw_wswls001"; //:: Longsword
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("erythnul") || GetStringRight(sDeity, 6) == GetStringLowerCase("arawai")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("bane") || GetStringRight(sDeity, 7) == GetStringLowerCase("hruggek")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("ngatha") || GetStringRight(sDeity, 6) == GetStringLowerCase("memnor")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("wathaku"))
|
|
sResRef = "nw_wblms001"; //:: Morningstar
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("gruumsh") || GetStringRight(sDeity, 10) == GetStringLowerCase("angharradh")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("annam") || GetStringRight(sDeity, 10) == GetStringLowerCase("aventernus")
|
|
|| GetStringRight(sDeity, 13) == GetStringLowerCase("wildwanderer") || GetStringRight(sDeity, 7) == GetStringLowerCase("boldrei")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("celestian") || GetStringRight(sDeity, 5) == GetStringLowerCase("eadro")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("geshtai") || GetStringRight(sDeity, 6) == GetStringLowerCase("hiatea")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("kaelthiere") || GetStringRight(sDeity, 6) == GetStringLowerCase("kithin")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("kurtulmak") || GetStringRight(sDeity, 5) == GetStringLowerCase("lurue")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("procan") || GetStringRight(sDeity, 5) == GetStringLowerCase("sebek")
|
|
|| GetStringRight(sDeity, 3) == GetStringLowerCase("set") || GetStringRight(sDeity, 7) == GetStringLowerCase("skerrit")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("talos") || GetStringRight(sDeity, 7) == GetStringLowerCase("telchur")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("trithereon") || GetStringRight(sDeity, 6) == GetStringLowerCase("ulutiu"))
|
|
sResRef = "nw_wplss001"; //:: Spear
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("hextor") || GetStringRight(sDeity, 11) == GetStringLowerCase("patient one"))
|
|
sResRef = "nw_wblfl001"; //:: Light Flail
|
|
|
|
else if(GetStringRight(sDeity, 5) == GetStringLowerCase("akadi") || GetStringRight(sDeity, 8) == GetStringLowerCase("lliendil")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("osiris") || GetStringRight(sDeity, 8) == GetStringLowerCase("urogalan"))
|
|
sResRef = "nw_wblfh001"; //:: Heavy Flail
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("domiel") || GetStringRight(sDeity, 9) == GetStringLowerCase("windstrom")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("brightaxe") || GetStringRight(sDeity, 3) == GetStringLowerCase("iuz")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("kord") || GetStringRight(sDeity, 10) == GetStringLowerCase("shaundakul")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("surtr") || GetStringRight(sDeity, 14) == GetStringLowerCase("lord of blades")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("torm") || GetStringRight(sDeity, 6) == GetStringLowerCase("typhos")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("zarus"))
|
|
sResRef = "nw_wswgs001"; //:: Greatsword
|
|
|
|
else if(GetStringRight(sDeity, 7) == GetStringLowerCase("aulasha") || GetStringRight(sDeity, 9) == GetStringLowerCase("steelskin")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("ironhand") || GetStringRight(sDeity, 7) == GetStringLowerCase("grumbar")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("gond") || GetStringRight(sDeity, 8) == GetStringLowerCase("istishia")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("laduguer") || GetStringRight(sDeity, 5) == GetStringLowerCase("lyris")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("moradin") || GetStringRight(sDeity, 6) == GetStringLowerCase("onatar")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("stonebones") || GetStringRight(sDeity, 9) == GetStringLowerCase("stronmaus"))
|
|
sResRef = "nw_wblhw001"; //:: Warhammer
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("chauntea") || GetStringRight(sDeity, 11) == GetStringLowerCase("chronepsis")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("duthila") || GetStringRight(sDeity, 8) == GetStringLowerCase("iborighu")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("jergal") || GetStringRight(sDeity, 6) == GetStringLowerCase("nerull")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("keeper") || GetStringRight(sDeity, 5) == GetStringLowerCase("zuggtmoy"))
|
|
sResRef = "nw_wplsc001"; //:: Scythe
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("halmyr") || GetStringRight(sDeity, 6) == GetStringLowerCase("halmyr")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("levistus") || GetStringRight(sDeity, 4) == GetStringLowerCase("lirr")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("milil") || GetStringRight(sDeity, 10) == GetStringLowerCase("olidammara")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("the fury"))
|
|
sResRef = "nw_wswrp001"; //:: Rapier
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("cuthbert") || GetStringRight(sDeity, 5) == GetStringLowerCase("pelor")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("truesilver") || GetStringRight(sDeity, 8) == GetStringLowerCase("kikanuti")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("korran") || GetStringRight(sDeity, 9) == GetStringLowerCase("lathander")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("duin") || GetStringRight(sDeity, 5) == GetStringLowerCase("orcus")
|
|
|| GetStringRight(sDeity, 11) == GetStringLowerCase("earthcaller") || GetStringRight(sDeity, 6) == GetStringLowerCase("selune")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("selvetarm") || GetStringRight(sDeity, 6) == GetStringLowerCase("syeret")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("syreth") || GetStringRight(sDeity, 7) == GetStringLowerCase("urbanus"))
|
|
sResRef = "prc_wxblmh001"; //:: Heavy Mace
|
|
|
|
else if(GetStringRight(sDeity, 3) == GetStringLowerCase("rao") || GetStringRight(sDeity, 9) == GetStringLowerCase("siamorphe"))
|
|
sResRef = "nw_wblml001"; //:: Light Mace
|
|
|
|
else if(GetStringRight(sDeity, 3) == GetStringLowerCase("jas") || GetStringRight(sDeity, 5) == GetStringLowerCase("vecna")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("lorfiril") || GetStringRight(sDeity, 11) == GetStringLowerCase("cloakshadow")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("abbathor") || GetStringRight(sDeity, 11) == GetStringLowerCase("brandobaris")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("thaun") || GetStringRight(sDeity, 6) == GetStringLowerCase("deneir")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("diirinka") || GetStringRight(sDeity, 5) == GetStringLowerCase("glory")
|
|
|| GetStringRight(sDeity, 9) == GetStringLowerCase("mestarine") || GetStringRight(sDeity, 8) == GetStringLowerCase("gargauth")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("celanil") || GetStringRight(sDeity, 5) == GetStringLowerCase("istus")
|
|
|| GetStringRight(sDeity, 11) == GetStringLowerCase("kiaransalee") || GetStringRight(sDeity, 6) == GetStringLowerCase("savras")
|
|
|| GetStringRight(sDeity, 11) == GetStringLowerCase("shekinester") || GetStringRight(sDeity, 9) == GetStringLowerCase("tharizdun")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("of vol") || GetStringRight(sDeity, 5) == GetStringLowerCase("zagyg"))
|
|
sResRef = "nw_wswdg001"; //:: Dagger
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("afflux") || GetStringRight(sDeity, 8) == GetStringLowerCase("arvoreen")
|
|
|| GetStringRight(sDeity, 12) == GetStringLowerCase("brightmantle") || GetStringRight(sDeity, 7) == GetStringLowerCase("ilesere")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("hathor") || GetStringRight(sDeity, 4) == GetStringLowerCase("hlal")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("nadirech") || GetStringRight(sDeity, 8) == GetStringLowerCase("shargaas")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("sixin") || GetStringRight(sDeity, 8) == GetStringLowerCase("vhaeraun")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("yondalla"))
|
|
sResRef = "nw_wswss001"; //:: Shortsword
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("kelemvor") || GetStringRight(sDeity, 4) == GetStringLowerCase("helm")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("wyvernspur") || GetStringRight(sDeity, 10) == GetStringLowerCase("eilistraee")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("aengrist"))
|
|
sResRef = "nw_wswbs001"; //:: Bastard Sword
|
|
|
|
else if(GetStringRight(sDeity, 11) == GetStringLowerCase("aasterinian") || GetStringRight(sDeity, 9) == GetStringLowerCase("astilabor")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("doresain") || GetStringRight(sDeity, 8) == GetStringLowerCase("falazure")
|
|
|| GetStringRight(sDeity, 4) == GetStringLowerCase("haku") || GetStringRight(sDeity, 8) == GetStringLowerCase("mielikki")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("nilthina") || GetStringRight(sDeity, 8) == GetStringLowerCase("soorinek")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("tamara") || GetStringRight(sDeity, 8) == GetStringLowerCase("traveler")
|
|
|| GetStringRight(sDeity, 13) == GetStringLowerCase("undying court"))
|
|
sResRef = "nw_wswsc001"; //:: Scimitar
|
|
|
|
else if(GetStringRight(sDeity, 19) == GetStringLowerCase("spirits of the past"))
|
|
sResRef = "prc_wxdbsc001"; //:: Double Scimitar
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("mouqol"))
|
|
sResRef = "nw_wbwxl001"; //:: Light Crossbow
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("cyndor"))
|
|
sResRef = "nw_wbwsl001"; //:: Sling
|
|
|
|
else if(GetStringRight(sDeity, 4) == GetStringLowerCase("isis"))
|
|
sResRef = "prc_wswdp001"; //:: Katar (punching dagger)
|
|
|
|
else if(GetStringRight(sDeity, 5) == GetStringLowerCase("arrah"))
|
|
sResRef = "nw_wplhb001"; //:: Halberd
|
|
|
|
else if(GetStringRight(sDeity, 5) == GetStringLowerCase("delleb"))
|
|
sResRef = "nw_wthdt001"; //:: Dart
|
|
|
|
else if(GetStringRight(sDeity, 12) == GetStringLowerCase("great mother") || GetStringRight(sDeity, 8) == GetStringLowerCase("sulerian")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("thrym"))
|
|
sResRef = "nw_waxgr001"; //:: Greataxe
|
|
|
|
else if(GetStringRight(sDeity, 9) == GetStringLowerCase("tem-et-nu") || GetStringRight(sDeity, 7) == GetStringLowerCase("mockery"))
|
|
sResRef = "nw_wspka001"; //:: Kama
|
|
|
|
else if(GetStringRight(sDeity, 9) == GetStringLowerCase("dumathoin") || GetStringRight(sDeity, 8) == GetStringLowerCase("silvanus"))
|
|
sResRef = "prc_wxblma001"; //:: Maul
|
|
|
|
else if(GetStringRight(sDeity, 9) == GetStringLowerCase("shevarash") || GetStringRight(sDeity, 10) == GetStringLowerCase("thelandira")
|
|
|| GetStringRight(sDeity, 12) == GetStringLowerCase("silver flame") || GetStringRight(sDeity, 10) == GetStringLowerCase("gilmadrith"))
|
|
sResRef = "nw_wbwln001"; //:: Long Bow
|
|
|
|
else if(GetStringRight(sDeity, 11) == GetStringLowerCase("cyrrollalee") || GetStringRight(sDeity, 9) == GetStringLowerCase("grolantor")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("konkresh") || GetStringRight(sDeity, 5) == GetStringLowerCase("kyuss")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("semuanya") || GetStringRight(sDeity, 6) == GetStringLowerCase("vaprak")
|
|
|| GetStringRight(sDeity, 12) == GetStringLowerCase("whale mother"))
|
|
sResRef = "nw_wblcl001"; //:: Club
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("ishtus") || GetStringRight(sDeity, 4) == GetStringLowerCase("azul")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("lolth") || GetStringRight(sDeity, 8) == GetStringLowerCase("nephthys")
|
|
|| GetStringRight(sDeity, 10) == GetStringLowerCase("sharindlar") || GetStringRight(sDeity, 6) == GetStringLowerCase("sune"))
|
|
sResRef = "x2_it_wpwhip"; //:: Whip
|
|
|
|
else if(GetStringRight(sDeity, 7) == GetStringLowerCase("bahamut") || GetStringRight(sDeity, 8) == GetStringLowerCase("nobanion")
|
|
|| GetStringRight(sDeity, 12) == GetStringLowerCase("dragon below") || GetStringRight(sDeity, 6) == GetStringLowerCase("tiamat")
|
|
|| GetStringRight(sDeity, 5) == GetStringLowerCase("ubtao"))
|
|
sResRef = "prc_wblph001"; //:: Heavy Pick
|
|
|
|
else if(GetStringRight(sDeity, 9) == GetStringLowerCase("waukeen") || GetStringRight(sDeity, 6) == GetStringLowerCase("zouken"))
|
|
sResRef = "prc_wblnn001"; //:: Nunchaku
|
|
|
|
else if(GetStringRight(sDeity, 5) == GetStringLowerCase("garyx") || GetStringRight(sDeity, 7) == GetStringLowerCase("olladra")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("peryroyl"))
|
|
sResRef = "nw_wspsc001"; //:: Sickle
|
|
|
|
else if(GetStringRight(sDeity, 6) == GetStringLowerCase("lliira") || GetStringRight(sDeity, 6) == GetStringLowerCase("mystra")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("tymora"))
|
|
sResRef = "nw_wthsh001"; //:: Throwing Stars
|
|
|
|
else if(GetStringRight(sDeity, 8) == GetStringLowerCase("sashelas") || GetStringRight(sDeity, 5) == GetStringLowerCase("hleid")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("osprem") || GetStringRight(sDeity, 8) == GetStringLowerCase("sekolah")
|
|
|| GetStringRight(sDeity, 8) == GetStringLowerCase("devourer") || GetStringRight(sDeity, 8) == GetStringLowerCase("umberlee")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("yeathan"))
|
|
sResRef = "nw_wpltr001"; //:: Trident
|
|
|
|
else if(GetStringRight(sDeity, 7) == GetStringLowerCase("ilmater") || GetStringRight(sDeity, 9) == GetStringLowerCase("ilsensine")
|
|
|| GetStringRight(sDeity, 6) == GetStringLowerCase("sophia") || GetStringRight(sDeity, 6) == GetStringLowerCase("talona")
|
|
|| GetStringRight(sDeity, 13) == GetStringLowerCase("path of light") || GetStringRight(sDeity, 7) == GetStringLowerCase("yurtrus")
|
|
|| GetStringRight(sDeity, 7) == GetStringLowerCase("sharess") || GetStringRight(sDeity, 7) == GetStringLowerCase("malar"))
|
|
{ //sResRef = "nw_wpltr001";
|
|
sResRef = "prc_sprtwpn_slam"; //:: Unarmed Strike
|
|
}
|
|
|
|
else if(sDeity == "" && nDomAlignment == ALIGNMENT_EVIL)
|
|
sResRef = "nw_wblfl001"; //:: Light Flail
|
|
|
|
else if(sDeity == "" && nDomAlignment == ALIGNMENT_CHAOTIC)
|
|
sResRef = "nw_waxbt001"; //:: Battleaxe
|
|
|
|
else if(sDeity == "" && nDomAlignment == ALIGNMENT_GOOD)
|
|
sResRef = "nw_wblhw001"; //:: Warhammer
|
|
|
|
else if(sDeity == "" && nDomAlignment == ALIGNMENT_LAWFUL)
|
|
sResRef = "nw_wswgs001"; //:: Greatsword
|
|
|
|
else if(sDeity == "" && nDomAlignment == ALIGNMENT_NEUTRAL)
|
|
sResRef = "nw_wswsc001"; //:: Scimitar
|
|
|
|
return sResRef;
|
|
}
|
|
|
|
object CreateDeityWeapon(object oCreature)
|
|
{
|
|
string sWeapon = GetSpiritualWeaponTypeByDeity(oCreature);
|
|
|
|
if(sWeapon == "")
|
|
return OBJECT_INVALID;
|
|
|
|
object oWeapon = CreateItemOnObject(sWeapon, oCreature);
|
|
|
|
EquipDebugString(GetName(oCreature) + " has Deity weapon "+GetName(oWeapon));
|
|
return oWeapon;
|
|
}
|
|
|
|
//:: Creates the weapon that the creature will be using.
|
|
void CreateSpiritualWeapon(object oCaster, float fDuration, int nClass)
|
|
{
|
|
//:: Declare major variables
|
|
int iCasterLvL = PRCGetCasterLevel(oCaster);
|
|
int nBAB = GetBaseAttackBonus(oCaster);
|
|
int nAttNumber = 1+(nBAB / 4);
|
|
int nDamBonus = min(5, iCasterLvL / 3);
|
|
int nPenetr = iCasterLvL + SPGetPenetr();
|
|
int nStat = nClass == CLASS_TYPE_INVALID ?
|
|
GetAbilityModifier(ABILITY_CHARISMA, oCaster) ://:: if cast from items use charisma by default
|
|
GetDCAbilityModForClass(nClass, oCaster);
|
|
|
|
object oWeapon;
|
|
object oArmor;
|
|
object oAmmo1;
|
|
object oAmmo2;
|
|
|
|
string sWeapon = GetSpiritualWeaponTypeByDeity(oCaster);
|
|
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Hooking Event.");
|
|
|
|
RegisterSummonEvents(oSummon);
|
|
|
|
int i = 1;
|
|
while(GetIsObjectValid(oSummon) && !GetIsPC(oSummon) && ! GetIsDM(oSummon))
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
|
|
if(GetResRef(oSummon) == "prc_spirit_weapn") //:: Unarmed / "Claw Bracer"
|
|
{
|
|
SetBaseAttackBonus(nAttNumber, oSummon);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn:" +GetName(oCaster)+"'s BAB is: "+IntToString(nBAB));
|
|
//EffectModifyAttacks(nAttNumber);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Adding "+IntToString(nAttNumber)+" attacks / round.");
|
|
SetLocalInt(oSummon, "X2_L_NUMBER_OF_ATTACKS", nAttNumber);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Storing caster as: " + GetName(oCaster));
|
|
DelayCommand(0.0f, SetLocalObject(oSummon, "MY_CASTER", oCaster));
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GHOST_SMOKE_2), oSummon);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT), oSummon);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectAttackIncrease(nBAB+nStat), oSummon);
|
|
|
|
if(!GetIsObjectValid(GetItemPossessedBy(oSummon, sWeapon)))
|
|
{
|
|
//Create item on the creature, equip it and add properties.
|
|
oWeapon = CreateItemOnObject(sWeapon, oSummon);
|
|
|
|
//Add event scripts
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONUNAQUIREITEM, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onUnacquire event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONPLAYERUNEQUIPITEM, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onUnequip event script on weapon");
|
|
|
|
// GZ: Fix for weapon being dropped when killed
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
if(sWeapon == "prc_sprtwpn_slam")
|
|
{
|
|
NullifyAppearance(oSummon, TRUE);
|
|
oArmor = CreateItemOnObject("prc_sprtwp_armor", oSummon);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_CWEAPON_R);
|
|
ForceEquip(oSummon, oArmor, INVENTORY_SLOT_CHEST);
|
|
SetItemCursedFlag(oArmor, TRUE);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GLOW_WHITE), oSummon);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
}
|
|
else if(sWeapon == "nw_wbwln001") //:: Longbow
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
oAmmo1 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo1, 99);
|
|
SetDroppableFlag(oAmmo1, FALSE);
|
|
SetItemCursedFlag(oAmmo1, TRUE);
|
|
|
|
AddEventScript(oAmmo1, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on ammo");
|
|
|
|
oAmmo2 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo2, 99);
|
|
SetDroppableFlag(oAmmo2, FALSE);
|
|
SetItemCursedFlag(oAmmo2, TRUE);
|
|
|
|
AddEventScript(oAmmo2, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on ammo");
|
|
|
|
ForceEquip(oSummon, oAmmo1, INVENTORY_SLOT_ARROWS);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage1 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo1, ipDamage1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz1 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipViz1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipHit1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam1 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipNoDam1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipDamage2 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo2, ipDamage2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit2 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipHit2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz2 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipViz2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam2 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipNoDam2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit3 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz3 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam3 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wbwxl001") //:: Light crossbow
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
oAmmo1 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo1, 99);
|
|
SetDroppableFlag(oAmmo1, FALSE);
|
|
SetItemCursedFlag(oAmmo1, TRUE);
|
|
|
|
AddEventScript(oAmmo1, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on ammo");
|
|
|
|
oAmmo2 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo2, 99);
|
|
SetDroppableFlag(oAmmo2, FALSE);
|
|
SetItemCursedFlag(oAmmo2, TRUE);
|
|
|
|
AddEventScript(oAmmo2, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on ammo");
|
|
|
|
ForceEquip(oSummon, oAmmo1, INVENTORY_SLOT_BOLTS);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage1 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo1, ipDamage1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz1 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipViz1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipHit1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam1 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipNoDam1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipDamage2 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo2, ipDamage2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit2 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipHit2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz2 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipViz2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam2 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipNoDam2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit3 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz3 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam3 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wthsh001") //:: Throwing Stars
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
SetItemStackSize(oWeapon, 50);
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
object oWeapon2 = CreateItemOnObject("nw_wthsh001", oSummon);
|
|
SetItemStackSize(oWeapon2, 50);
|
|
SetDroppableFlag(oWeapon2, FALSE);
|
|
SetItemCursedFlag(oWeapon2, TRUE);
|
|
|
|
AddEventScript(oWeapon2, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
object oWeapon3 = CreateItemOnObject("nw_wthsh001", oSummon);
|
|
SetItemStackSize(oWeapon3, 50);
|
|
SetDroppableFlag(oWeapon3, FALSE);
|
|
SetItemCursedFlag(oWeapon3, TRUE);
|
|
|
|
AddEventScript(oWeapon3, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon2, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wthdt001") //:: Darts
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
SetItemStackSize(oWeapon, 50);
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
object oWeapon2 = CreateItemOnObject("nw_wthdt001", oSummon);
|
|
SetItemStackSize(oWeapon2, 50);
|
|
SetDroppableFlag(oWeapon2, FALSE);
|
|
SetItemCursedFlag(oWeapon2, TRUE);
|
|
|
|
AddEventScript(oWeapon2, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
object oWeapon3 = CreateItemOnObject("nw_wthdt001", oSummon);
|
|
SetItemStackSize(oWeapon3, 50);
|
|
SetDroppableFlag(oWeapon3, FALSE);
|
|
SetItemCursedFlag(oWeapon3, TRUE);
|
|
|
|
AddEventScript(oWeapon3, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon2, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon3, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else //:: Covers all other weapons
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
|
|
}
|
|
}
|
|
i++;
|
|
oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster, i);
|
|
}
|
|
}
|
|
|
|
void HandleSpiritualWeaponUnequipEvent()
|
|
{
|
|
// Get the creature who unequipped the item
|
|
object oSummon = GetPCItemLastUnequippedBy();
|
|
object oCaster = GetLocalObject(oSummon, "MY_CASTER");
|
|
|
|
// Get the item that was unequipped
|
|
object oWeapon = GetPCItemLastUnequipped();
|
|
|
|
if(GetIsPC(oSummon) == TRUE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
|
int nDuration = nCasterLevel;
|
|
int nPenetr = nCasterLevel + SPGetPenetr();
|
|
int nDamBonus = min(5, nCasterLevel / 3);
|
|
float fDuration = IntToFloat(nDuration);
|
|
|
|
// Log the event for debugging
|
|
SendMessageToPC(oCaster, "prc_spirweap_tbs: Item OnUnEquip Event running.");
|
|
|
|
// Check if the item is valid
|
|
if (GetIsObjectValid(oWeapon))
|
|
{
|
|
// Log the item destruction for debugging
|
|
SendMessageToPC(oCaster, "prc_spirweap_tbs: Unequipped item detected. Destroying item.");
|
|
|
|
// Destroy the unequipped item
|
|
DestroyObject(oWeapon);
|
|
|
|
string sWeapon = GetSpiritualWeaponTypeByDeity(oCaster);
|
|
object oArmor;
|
|
|
|
if(!GetIsObjectValid(GetItemPossessedBy(oSummon, sWeapon)))
|
|
{
|
|
//Create item on the creature, equip it and add properties.
|
|
oWeapon = CreateItemOnObject(sWeapon, oSummon);
|
|
|
|
//Add event scripts
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ONHIT, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onHit event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONUNAQUIREITEM, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onUnacquire event script on weapon");
|
|
AddEventScript(oWeapon, EVENT_ITEM_ONPLAYERUNEQUIPITEM, "prc_evnt_spirwep", TRUE, FALSE);
|
|
SendMessageToPC(oCaster, "inc_spirit_weapn: Setting onUnequip event script on weapon");
|
|
|
|
// GZ: Fix for weapon being dropped when killed
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
if(sWeapon == "prc_sprtwpn_slam")
|
|
{
|
|
NullifyAppearance(oSummon, TRUE);
|
|
oArmor = CreateItemOnObject("prc_sprtwp_armor", oSummon);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_CWEAPON_R);
|
|
ForceEquip(oSummon, oArmor, INVENTORY_SLOT_CHEST);
|
|
SetItemCursedFlag(oArmor, TRUE);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GLOW_WHITE), oSummon);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
}
|
|
else if(sWeapon == "nw_wbwln001") //:: Longbow
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
object oAmmo1 = CreateItemOnObject("nw_wamar001", oSummon);
|
|
SetItemStackSize(oAmmo1, 99);
|
|
SetDroppableFlag(oAmmo1, FALSE);
|
|
SetItemCursedFlag(oAmmo1, TRUE);
|
|
|
|
object oAmmo2 = CreateItemOnObject("nw_wamar001", oSummon);
|
|
SetItemStackSize(oAmmo2, 99);
|
|
SetDroppableFlag(oAmmo2, FALSE);
|
|
SetItemCursedFlag(oAmmo2, TRUE);
|
|
|
|
ForceEquip(oSummon, oAmmo1, INVENTORY_SLOT_ARROWS);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage1 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo1, ipDamage1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz1 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipViz1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipHit1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam1 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipNoDam1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipDamage2 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo2, ipDamage2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit2 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipHit2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz2 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipViz2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam2 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipNoDam2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit3 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz3 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam3 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wbwxl001") //:: Light crossbow
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
object oAmmo1 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo1, 99);
|
|
SetDroppableFlag(oAmmo1, FALSE);
|
|
SetItemCursedFlag(oAmmo1, TRUE);
|
|
|
|
object oAmmo2 = CreateItemOnObject("nw_wambo001", oSummon);
|
|
SetItemStackSize(oAmmo2, 99);
|
|
SetDroppableFlag(oAmmo2, FALSE);
|
|
SetItemCursedFlag(oAmmo2, TRUE);
|
|
|
|
ForceEquip(oSummon, oAmmo1, INVENTORY_SLOT_BOLTS);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage1 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo1, ipDamage1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz1 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipViz1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipHit1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam1 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo1, ipNoDam1, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipDamage2 = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oAmmo2, ipDamage2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit2 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipHit2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz2 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipViz2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam2 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oAmmo2, ipNoDam2, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit3 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz3 = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam3 = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam3, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wthsh001") //:: Throwing Stars
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
SetItemStackSize(oWeapon, 50);
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
object oWeapon2 = CreateItemOnObject("nw_wthsh001", oSummon);
|
|
SetItemStackSize(oWeapon2, 50);
|
|
SetDroppableFlag(oWeapon2, FALSE);
|
|
SetItemCursedFlag(oWeapon2, TRUE);
|
|
|
|
object oWeapon3 = CreateItemOnObject("nw_wthsh001", oSummon);
|
|
SetItemStackSize(oWeapon3, 50);
|
|
SetDroppableFlag(oWeapon3, FALSE);
|
|
SetItemCursedFlag(oWeapon3, TRUE);
|
|
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon2, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon3, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else if(sWeapon == "nw_wthdt001") //:: Darts
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
SetItemStackSize(oWeapon, 50);
|
|
SetDroppableFlag(oWeapon, FALSE);
|
|
SetItemCursedFlag(oWeapon, TRUE);
|
|
|
|
object oWeapon2 = CreateItemOnObject("nw_wthdt001", oSummon);
|
|
SetItemStackSize(oWeapon2, 50);
|
|
SetDroppableFlag(oWeapon2, FALSE);
|
|
SetItemCursedFlag(oWeapon2, TRUE);
|
|
|
|
object oWeapon3 = CreateItemOnObject("nw_wthdt001", oSummon);
|
|
SetItemStackSize(oWeapon3, 50);
|
|
SetDroppableFlag(oWeapon3, FALSE);
|
|
SetItemCursedFlag(oWeapon3, TRUE);
|
|
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon2, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon2, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon3, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon3, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
else //:: Covers all other weapons
|
|
{
|
|
NullifyAppearance(oSummon);
|
|
ForceEquip(oSummon, oWeapon, INVENTORY_SLOT_RIGHTHAND);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageIncrease(nDamBonus, DAMAGE_TYPE_MAGICAL), oSummon);
|
|
|
|
itemproperty ipDamage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1d8);
|
|
DelayCommand(0.0f, IPSafeAddItemProperty(oWeapon, ipDamage, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipViz = ItemPropertyVisualEffect(ITEM_VISUAL_SONIC);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipViz, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipHit = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, nPenetr);
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipHit, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
DelayCommand(0.0f,IPSafeAddItemProperty(oWeapon, ipNoDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oCaster, "prc_spirweap_tbs: No valid item to destroy.");
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
//:: void main(){} |