667 lines
26 KiB
Plaintext
667 lines
26 KiB
Plaintext
//::///////////////////////////////////////////////
|
||
//:: Greater Wild Shape, Humanoid Shape
|
||
//:: x2_s2_gwildshp
|
||
//:: Copyright (c) 2003 Bioware Corp.
|
||
//:://////////////////////////////////////////////
|
||
/*
|
||
Allows the character to shift into one of these
|
||
forms, gaining special abilities
|
||
|
||
Credits must be given to mr_bumpkin from the NWN
|
||
community who had the idea of merging item properties
|
||
from weapon and armor to the creatures new forms.
|
||
|
||
*/
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Georg Zoeller
|
||
//:: Created On: 2003-07-02
|
||
//:://////////////////////////////////////////////
|
||
|
||
#include "x2_inc_shifter"
|
||
#include "x2_inc_itemprop"
|
||
|
||
void LDAddItemProperty(itemproperty ip,object oNew, int First=FALSE, int Last=FALSE)
|
||
{
|
||
if(First)
|
||
{
|
||
SetLocalInt(oNew,"AC",0);SetLocalInt(oNew,"CHA",0);SetLocalInt(oNew,"DEX",0);
|
||
SetLocalInt(oNew,"INT",0);SetLocalInt(oNew,"WIS",0);SetLocalInt(oNew,"STR",0);
|
||
SetLocalInt(oNew,"CON",0);SetLocalInt(oNew,"REGEN",0);
|
||
}
|
||
if(GetItemPropertyType(ip) == ITEM_PROPERTY_AC_BONUS)
|
||
{int iAC = GetLocalInt(oNew,"AC")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"AC",(iAC > 20 ? 20 : iAC));}
|
||
else if(GetItemPropertyType(ip) == ITEM_PROPERTY_ABILITY_BONUS)
|
||
{
|
||
switch(GetItemPropertySubType(ip))
|
||
{
|
||
case ABILITY_CHARISMA:{int iAB = GetLocalInt(oNew,"CHA")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"CHA",(iAB > 12 ? 12 : iAB));}break;
|
||
case ABILITY_CONSTITUTION:{int iAB = GetLocalInt(oNew,"CON")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"CON",(iAB > 12 ? 12 : iAB));}break;
|
||
case ABILITY_DEXTERITY:{int iAB = GetLocalInt(oNew,"DEX")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"DEX",(iAB > 12 ? 12 : iAB));}break;
|
||
case ABILITY_INTELLIGENCE:{int iAB = GetLocalInt(oNew,"INT")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"INT",(iAB > 12 ? 12 : iAB));}break;
|
||
case ABILITY_WISDOM:{int iAB = GetLocalInt(oNew,"WIS")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"WIS",(iAB > 12 ? 12 : iAB));}break;
|
||
case ABILITY_STRENGTH:{int iAB = GetLocalInt(oNew,"STR")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"STR",(iAB > 12 ? 12 : iAB));}break;
|
||
}
|
||
}
|
||
else if(GetItemPropertyType(ip) == ITEM_PROPERTY_REGENERATION)
|
||
{
|
||
int iREG = GetLocalInt(oNew,"REGEN")+GetItemPropertyCostTableValue(ip);
|
||
SetLocalInt(oNew,"REGEN",(iREG > 20 ? 20 : iREG));
|
||
} else {
|
||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||
}
|
||
if(Last)
|
||
{
|
||
if(GetItemPropertyType(ip) != ITEM_PROPERTY_ABILITY_BONUS &&
|
||
GetItemPropertyType(ip) != ITEM_PROPERTY_AC_BONUS &&
|
||
GetItemPropertyType(ip) != ITEM_PROPERTY_REGENERATION)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);}
|
||
if(GetLocalInt(oNew,"AC") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyACBonus(GetLocalInt(oNew,"AC")),oNew);
|
||
DeleteLocalInt(oNew,"AC");}
|
||
if(GetLocalInt(oNew,"CHA") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_CHARISMA,GetLocalInt(oNew,"CHA")),oNew);
|
||
DeleteLocalInt(oNew,"CHA");}
|
||
if(GetLocalInt(oNew,"CON") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_CONSTITUTION,GetLocalInt(oNew,"CON")),oNew);
|
||
DeleteLocalInt(oNew,"CON");}
|
||
if(GetLocalInt(oNew,"DEX") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_DEXTERITY,GetLocalInt(oNew,"DEX")),oNew);
|
||
DeleteLocalInt(oNew,"DEX");}
|
||
if(GetLocalInt(oNew,"WIS") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_WISDOM,GetLocalInt(oNew,"WIS")),oNew);
|
||
DeleteLocalInt(oNew,"WIS");}
|
||
if(GetLocalInt(oNew,"INT") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_INTELLIGENCE,GetLocalInt(oNew,"INT")),oNew);
|
||
DeleteLocalInt(oNew,"INT");}
|
||
if(GetLocalInt(oNew,"STR") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAbilityBonus(ABILITY_STRENGTH,GetLocalInt(oNew,"STR")),oNew);
|
||
DeleteLocalInt(oNew,"STR");}
|
||
if(GetLocalInt(oNew,"REGEN") > 0)
|
||
{AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyRegeneration(GetLocalInt(oNew,"REGEN")),oNew);
|
||
DeleteLocalInt(oNew,"REGEN");}
|
||
}
|
||
}
|
||
|
||
void LDWildShapeCopyItemProperties(object oOld, object oNew, int Last=FALSE, int First=FALSE, int bWeapon=FALSE)
|
||
{
|
||
if (GetIsObjectValid(oOld) && GetIsObjectValid(oNew))
|
||
{
|
||
int Count = 0;int Current = 0;
|
||
itemproperty ip = GetFirstItemProperty(oOld);
|
||
while (GetIsItemPropertyValid(ip))
|
||
{
|
||
Count ++;
|
||
ip = GetNextItemProperty(oOld);
|
||
}
|
||
itemproperty iip = GetFirstItemProperty(oOld);
|
||
while (GetIsItemPropertyValid(iip))
|
||
{
|
||
if (bWeapon)
|
||
{
|
||
if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew))
|
||
{
|
||
AddItemProperty(DURATION_TYPE_PERMANENT,iip,oNew);
|
||
}
|
||
} else {
|
||
if(First && (Current == 0))
|
||
{LDAddItemProperty(iip,oNew,TRUE);
|
||
Current ++;
|
||
}
|
||
else if(Last && (Current == Count-1))
|
||
{LDAddItemProperty(iip,oNew,FALSE,TRUE);
|
||
Current ++;
|
||
} else {
|
||
LDAddItemProperty(iip,oNew);
|
||
Current ++;
|
||
}
|
||
}
|
||
iip = GetNextItemProperty(oOld);
|
||
}
|
||
}
|
||
}
|
||
|
||
int GetIsDamageing(object oGlove)
|
||
{
|
||
int Result = FALSE;
|
||
itemproperty ip = GetFirstItemProperty(oGlove);
|
||
while(GetIsItemPropertyValid(ip))
|
||
{
|
||
if(GetItemPropertyType(ip) == ITEM_PROPERTY_DAMAGE_BONUS ||
|
||
GetItemPropertyType(ip) == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP ||
|
||
GetItemPropertyType(ip) == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP ||
|
||
GetItemPropertyType(ip) == ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT)
|
||
{Result = TRUE;}
|
||
ip = GetNextItemProperty(oGlove);
|
||
}
|
||
return Result;
|
||
}
|
||
|
||
int GetIsUnarmed()
|
||
{
|
||
return (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF) == OBJECT_INVALID &&
|
||
GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF) == OBJECT_INVALID);
|
||
}
|
||
void LDShifterSetGWildshapeSpellLimits(int nSpellId)
|
||
{
|
||
string sId;
|
||
int nLevel = GetLevelByClass(CLASS_TYPE_SHIFTER);
|
||
switch (nSpellId)
|
||
{
|
||
case 673: // Drider Shape
|
||
sId = "688"; // SpellIndex of Drider Darkness Ability
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId, 1 + nLevel/2);
|
||
break;
|
||
case 670 : // Basilisk Shape
|
||
sId = "687"; // SpellIndex of Petrification Gaze Ability
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId, 1 + nLevel/2);
|
||
break;
|
||
case 679 : // Medusa Shape
|
||
sId = "687"; // SpellIndex of Petrification Gaze Ability
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId, 1+ nLevel);
|
||
break;
|
||
case 682 : // Drow shape
|
||
sId = "688"; // Darkness Ability
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId,1+ nLevel);
|
||
break;
|
||
case 691 : // Mindflayer shape
|
||
sId = "693"; // SpellIndex Mind Blast Ability
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId, 1 + nLevel);
|
||
break;
|
||
case 705: // Vampire Domination Gaze
|
||
sId = "800";
|
||
SetLocalInt(OBJECT_SELF,"X2_GWILDSHP_LIMIT_" + sId, 1 + nLevel);
|
||
break;
|
||
}
|
||
}
|
||
|
||
void main()
|
||
{
|
||
//--------------------------------------------------------------------------
|
||
// Declare major variables
|
||
//--------------------------------------------------------------------------
|
||
int nSpell = GetSpellId();
|
||
object oTarget = GetSpellTargetObject();
|
||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||
int nShifter = GetLevelByClass(CLASS_TYPE_SHIFTER);
|
||
effect ePoly;
|
||
int nPoly;
|
||
int Unarmed = GetIsUnarmed();
|
||
|
||
// Feb 13, 2004, Jon: Added scripting to take care of case where it's an NPC
|
||
// using one of the feats. It will randomly pick one of the shapes associated
|
||
// with the feat.
|
||
switch(nSpell)
|
||
{
|
||
// Greater Wildshape I
|
||
case 646: nSpell = Random(5)+658; break;
|
||
// Greater Wildshape II
|
||
case 675: switch(Random(3))
|
||
{
|
||
case 0: nSpell = 672; break;
|
||
case 1: nSpell = 678; break;
|
||
case 2: nSpell = 680;
|
||
}
|
||
break;
|
||
// Greater Wildshape III
|
||
case 676: switch(Random(3))
|
||
{
|
||
case 0: nSpell = 670; break;
|
||
case 1: nSpell = 673; break;
|
||
case 2: nSpell = 674;
|
||
}
|
||
break;
|
||
// Greater Wildshape IV
|
||
case 677: switch(Random(3))
|
||
{
|
||
case 0: nSpell = 679; break;
|
||
case 1: nSpell = 691; break;
|
||
case 2: nSpell = 694;
|
||
}
|
||
break;
|
||
// Humanoid Shape
|
||
case 681: nSpell = Random(3)+682; break;
|
||
// Undead Shape
|
||
case 685: nSpell = Random(3)+704; break;
|
||
// Dragon Shape
|
||
case 725: nSpell = Random(3)+707; break;
|
||
// Outsider Shape
|
||
case 732: nSpell = Random(3)+733; break;
|
||
// Construct Shape
|
||
case 737: nSpell = Random(3)+738; break;
|
||
}
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Determine which form to use based on spell id, gender and level
|
||
//--------------------------------------------------------------------------
|
||
switch (nSpell)
|
||
{
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Greater Wildshape I - Wyrmling Shape
|
||
//-----------------------------------------------------------------------
|
||
case 658: nPoly = POLYMORPH_TYPE_WYRMLING_RED; break;
|
||
case 659: nPoly = POLYMORPH_TYPE_WYRMLING_BLUE; break;
|
||
case 660: nPoly = POLYMORPH_TYPE_WYRMLING_BLACK; break;
|
||
case 661: nPoly = POLYMORPH_TYPE_WYRMLING_WHITE; break;
|
||
case 662: nPoly = POLYMORPH_TYPE_WYRMLING_GREEN; break;
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Greater Wildshape II - Minotaur, Gargoyle, Harpy
|
||
//-----------------------------------------------------------------------
|
||
case 672: if (nShifter < X2_GW2_EPIC_THRESHOLD)
|
||
nPoly = POLYMORPH_TYPE_HARPY;
|
||
else
|
||
nPoly = 97;
|
||
break;
|
||
|
||
case 678: if (nShifter < X2_GW2_EPIC_THRESHOLD)
|
||
nPoly = POLYMORPH_TYPE_GARGOYLE;
|
||
else
|
||
nPoly = 98;
|
||
break;
|
||
|
||
case 680: if (nShifter < X2_GW2_EPIC_THRESHOLD) // minotaur
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 182;}
|
||
else
|
||
{nPoly = POLYMORPH_TYPE_MINOTAUR;}
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 190;}
|
||
else
|
||
{nPoly = 96;}
|
||
}
|
||
break;
|
||
|
||
case 1501: if (nShifter < X2_GW2_EPIC_THRESHOLD) //ogre
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 203;}
|
||
else
|
||
{nPoly = 159;}
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 204;}
|
||
else
|
||
{nPoly = 160;}
|
||
}
|
||
break;
|
||
|
||
case 1502: if (nShifter < X2_GW2_EPIC_THRESHOLD) // gorgon
|
||
nPoly = 158;
|
||
else
|
||
nPoly = 173;
|
||
break;
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Greater Wildshape III - Drider, Basilisk, Manticore
|
||
//-----------------------------------------------------------------------
|
||
case 670: if (nShifter < X2_GW3_EPIC_THRESHOLD)
|
||
nPoly = POLYMORPH_TYPE_BASILISK;
|
||
else
|
||
nPoly = 99;
|
||
break;
|
||
|
||
case 673: if (nShifter < X2_GW3_EPIC_THRESHOLD)
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 181;}
|
||
else
|
||
{nPoly = POLYMORPH_TYPE_DRIDER;}
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 191;}
|
||
else
|
||
{nPoly = 100;}
|
||
}
|
||
break;
|
||
|
||
case 674: if (nShifter < X2_GW3_EPIC_THRESHOLD)
|
||
nPoly = POLYMORPH_TYPE_MANTICORE;
|
||
else
|
||
nPoly = 101;
|
||
break;
|
||
|
||
case 1503: if (nShifter < X2_GW3_EPIC_THRESHOLD)
|
||
nPoly = 162;
|
||
else //will o wisp
|
||
nPoly = 175;
|
||
break;
|
||
|
||
case 1504: if (nShifter < X2_GW3_EPIC_THRESHOLD)
|
||
nPoly = 161;
|
||
else //umber hulk
|
||
nPoly = 174;
|
||
break;
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Greater Wildshape IV - Dire Tiger, Medusa, MindFlayer
|
||
//-----------------------------------------------------------------------
|
||
case 679: nPoly = POLYMORPH_TYPE_MEDUSA; break;
|
||
case 691: nPoly = 68; break; // Mindflayer
|
||
case 694: nPoly = 69; break; // DireTiger
|
||
case 1507: if(GetGender(OBJECT_SELF) == GENDER_MALE) // frost giant
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 200;}
|
||
else
|
||
{nPoly = 155;}
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 201;}
|
||
else
|
||
{nPoly = 156;}
|
||
}break;
|
||
case 1508: nPoly = 176; break; // grey render
|
||
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Humanoid Shape - Kobold Commando, Drow, Lizard Crossbow Specialist
|
||
//-----------------------------------------------------------------------
|
||
case 682:
|
||
if(nShifter< 17)
|
||
{
|
||
if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow
|
||
{if(Unarmed)
|
||
{nPoly = 179;}
|
||
else
|
||
{nPoly = 59;}}
|
||
else
|
||
{if(Unarmed)
|
||
{nPoly = 180;}
|
||
else
|
||
{nPoly = 70;}}
|
||
}
|
||
else
|
||
{
|
||
if (GetGender(OBJECT_SELF) == GENDER_MALE) //drow
|
||
{if(Unarmed)
|
||
{nPoly = 194;}
|
||
else
|
||
{nPoly = 105;}}
|
||
else
|
||
{if(Unarmed)
|
||
{nPoly = 195;}
|
||
else
|
||
{nPoly = 106;}}
|
||
}
|
||
break;
|
||
case 683:
|
||
if(nShifter< 17)
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 184;}
|
||
else
|
||
{nPoly = 82;}
|
||
break; // Lizard
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 193;}
|
||
else
|
||
{nPoly =104;}
|
||
break; // Epic Lizard
|
||
}
|
||
case 684: if(nShifter< 17)
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 185;}
|
||
else
|
||
{nPoly = 83;}
|
||
break; // Kobold Commando
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 192;}
|
||
else
|
||
{nPoly = 103;}
|
||
break; // Kobold Commando
|
||
}
|
||
|
||
case 1505: if(nShifter< 17)
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 207;}
|
||
else
|
||
{nPoly = 165;}
|
||
break; // Stinger
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 208;}
|
||
else
|
||
{nPoly = 166;}
|
||
break; // Epic Stinger
|
||
}
|
||
|
||
case 1506: if(nShifter< 17)
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 205;}
|
||
else
|
||
{nPoly = 163;}
|
||
break; // Gnoll
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 206;}
|
||
else
|
||
{nPoly = 164;}
|
||
break; // Epic Gnoll
|
||
}
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Undead Shape - Spectre, Risen Lord, Vampire
|
||
//-----------------------------------------------------------------------
|
||
case 704: if(Unarmed) // Risen lord
|
||
{nPoly = 183;}
|
||
else
|
||
{nPoly = 75;}
|
||
break;
|
||
|
||
case 705: if (GetGender(OBJECT_SELF) == GENDER_MALE) // vampire
|
||
nPoly = 74;
|
||
else
|
||
nPoly = 77;
|
||
break;
|
||
|
||
case 706: nPoly = 76; break; /// spectre
|
||
case 1509:if(Unarmed) /// mummy lord
|
||
{nPoly = 202;}
|
||
else
|
||
{nPoly = 157;}
|
||
break;
|
||
case 1510: nPoly = 168; break; /// alhoon
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Dragon Shape - Red Blue and Green Dragons
|
||
//-----------------------------------------------------------------------
|
||
case 707: nPoly = 72; break; // Ancient Red Dragon
|
||
case 708: nPoly = 71; break; // Ancient Blue Dragon
|
||
case 709: nPoly = 73; break; // Ancient Green Dragon
|
||
case 1515: nPoly = 171; break; // Prismatic Dragon
|
||
case 1516: nPoly = 170; break; // Ancient Shadow Dragon
|
||
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Outsider Shape - Rakshasa, Azer Chieftain, Black Slaad
|
||
//-----------------------------------------------------------------------
|
||
case 733: if (GetGender(OBJECT_SELF) == GENDER_MALE) //azer
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 186;}
|
||
else
|
||
{nPoly = 85;}
|
||
}
|
||
else // anything else is female
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 187;}
|
||
else
|
||
{nPoly = 86;}
|
||
}
|
||
break;
|
||
|
||
case 734: if (GetGender(OBJECT_SELF) == GENDER_MALE) //rakshasa
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 188;}
|
||
else
|
||
{nPoly = 88;}
|
||
}
|
||
else // anything else is female
|
||
{
|
||
if(Unarmed)
|
||
{nPoly = 189;}
|
||
else
|
||
{nPoly = 89;}
|
||
}
|
||
break;
|
||
case 735: nPoly =87; break; // slaad
|
||
case 1511: if(Unarmed) // hound archon
|
||
{nPoly = 196;}
|
||
else
|
||
{nPoly =151;}
|
||
break;
|
||
case 1512: if(Unarmed) // formian
|
||
{nPoly = 209;}
|
||
else
|
||
{nPoly =172;}
|
||
break;
|
||
|
||
//-----------------------------------------------------------------------
|
||
// Construct Shape - Stone Golem, Iron Golem, Demonflesh Golem
|
||
//-----------------------------------------------------------------------
|
||
case 738: nPoly =91; break; // stone golem
|
||
case 739: nPoly =92; break; // demonflesh golem
|
||
case 740: nPoly =90; break; // iron golem
|
||
case 1513: if(Unarmed) // battle horror
|
||
{nPoly = 197;}
|
||
else
|
||
{nPoly =152;}
|
||
break;
|
||
case 1514: nPoly =169; break; // mithral golem
|
||
|
||
}
|
||
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Determine which items get their item properties merged onto the shifters
|
||
// new form.
|
||
//--------------------------------------------------------------------------
|
||
int bWeapon = ShifterMergeWeapon(nPoly);
|
||
int bArmor = TRUE;
|
||
int bItems = TRUE;
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Store the old objects so we can access them after the character has
|
||
// changed into his new form
|
||
//--------------------------------------------------------------------------
|
||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
|
||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF);
|
||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF);
|
||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF);
|
||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF);
|
||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF);
|
||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF);
|
||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF);
|
||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF);
|
||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF);
|
||
object oArmsOld = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF);
|
||
object oHandsOld = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF);
|
||
|
||
if (GetIsObjectValid(oShield))
|
||
{
|
||
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
||
GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD &&
|
||
GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD)
|
||
{
|
||
oShield = OBJECT_INVALID;
|
||
}
|
||
}
|
||
if(Unarmed)
|
||
{
|
||
if(GetIsDamageing(oHandsOld))
|
||
{oArmsOld = OBJECT_INVALID;}
|
||
else
|
||
{oHandsOld = OBJECT_INVALID;}
|
||
}
|
||
|
||
string sCopied = "<c <20> > Copied properties from:</c>";
|
||
sCopied += "<c <20><>> Armor, Helmet";
|
||
if(GetIsObjectValid(oShield)) {sCopied += ", Shield";}
|
||
sCopied += ", Rings, Amulet, Cloak, Boots, Belt";
|
||
if(GetIsObjectValid(oArmsOld) && GetBaseItemType(oArmsOld) == BASE_ITEM_BRACER)
|
||
{sCopied += ", Bracers";}
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Here the actual polymorphing is done
|
||
//--------------------------------------------------------------------------
|
||
ePoly = EffectPolymorph(nPoly);
|
||
ePoly = ExtraordinaryEffect(ePoly);
|
||
ClearAllActions(); // prevents an exploit
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, OBJECT_SELF);
|
||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
||
//--------------------------------------------------------------------------
|
||
// This code handles the merging of item properties
|
||
//--------------------------------------------------------------------------
|
||
object oWeaponNew = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
|
||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF);
|
||
object oClawNew = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,OBJECT_SELF);
|
||
object oSlamNew = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,OBJECT_SELF);
|
||
object oBiteNew = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,OBJECT_SELF);
|
||
SetIdentified(oWeaponNew, TRUE);
|
||
if (bWeapon)
|
||
{
|
||
LDWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, FALSE,FALSE,TRUE);
|
||
if(GetIsObjectValid(oWeaponOld)){sCopied += ",</c> <c<><63><EFBFBD>>Weapon";}
|
||
}
|
||
else
|
||
{
|
||
if(Unarmed){
|
||
if(GetIsObjectValid(oHandsOld))
|
||
{
|
||
LDWildShapeCopyItemProperties(oHandsOld,oClawNew, FALSE,FALSE);
|
||
LDWildShapeCopyItemProperties(oHandsOld,oSlamNew, FALSE,FALSE);
|
||
LDWildShapeCopyItemProperties(oHandsOld,oBiteNew, FALSE,FALSE);
|
||
sCopied += ",</c> <c<><63><EFBFBD>>Gloves to unarmed attacks";
|
||
}}
|
||
}
|
||
LDWildShapeCopyItemProperties(oArmorOld,oArmorNew,FALSE,TRUE);
|
||
LDWildShapeCopyItemProperties(oHelmetOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oShield,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oArmsOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oBeltOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oAmuletOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oCloakOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oBootsOld,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oRing1Old,oArmorNew);
|
||
LDWildShapeCopyItemProperties(oRing2Old,oArmorNew,TRUE);
|
||
LDShifterSetGWildshapeSpellLimits(nSpell);
|
||
SendMessageToPC(oTarget,sCopied);
|
||
}
|
||
|
||
|
||
|