313 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | ||
| //:: Wild Shape
 | ||
| //:: NW_S2_WildShape
 | ||
| //:: Copyright (c) 2001 Bioware Corp.
 | ||
| //:://////////////////////////////////////////////
 | ||
| /*
 | ||
|     Allows the Druid to change into animal forms.
 | ||
| 
 | ||
|     Updated: Sept 30 2003, Georg Z.
 | ||
|       * Made Armor merge with druid to make forms
 | ||
|         more useful.
 | ||
| 
 | ||
| */
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Created By: Preston Watamaniuk
 | ||
| //:: Created On: Jan 22, 2002
 | ||
| //:://////////////////////////////////////////////
 | ||
| // See ws_inc_shifter for details on the changes.
 | ||
| #include "ws_inc_shifter"
 | ||
| 
 | ||
| void main()
 | ||
| {
 | ||
|     //Declare major variables
 | ||
|     int nSpell = GetSpellId();
 | ||
|     object oTarget = GetSpellTargetObject();
 | ||
|     effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
 | ||
|     effect ePoly;
 | ||
|     int nPoly;
 | ||
|     int nMetaMagic = GetMetaMagicFeat();
 | ||
|     int nDuration = GetLevelByClass(CLASS_TYPE_DRUID);
 | ||
|     if (!GetLocalInt(GetModule(),"X3_NO_SHAPESHIFT_SPELL_CHECK"))
 | ||
|     { // check to see if abort due to being mounted
 | ||
|         switch(GetPhenoType(oTarget))
 | ||
|         {// shape shifting not allowed while mounted
 | ||
|             case 3:
 | ||
|             case 5:
 | ||
|             case 6:
 | ||
|             case 8:
 | ||
|             if(GetIsPC(oTarget))
 | ||
|             {
 | ||
|                 FloatingTextStrRefOnCreature(111982,oTarget,FALSE);
 | ||
|             }
 | ||
|             // shape shifting not allowed while mounted
 | ||
|             return;
 | ||
|         }
 | ||
|     } // check to see if abort due to being mounted
 | ||
|     //Enter Metamagic conditions
 | ||
|     if (nMetaMagic == METAMAGIC_EXTEND)
 | ||
|     {
 | ||
|         nDuration = nDuration *2; //Duration is +100%
 | ||
|     }
 | ||
| 
 | ||
|     //Determine Polymorph subradial type
 | ||
|     if(nSpell == 401)
 | ||
|     {
 | ||
|         nPoly = POLYMORPH_TYPE_BROWN_BEAR;
 | ||
|         if (nDuration >= 12)
 | ||
|         {
 | ||
|             nPoly = POLYMORPH_TYPE_DIRE_BROWN_BEAR;
 | ||
|         }
 | ||
|     }
 | ||
|     else if (nSpell == 402)
 | ||
|     {
 | ||
|         nPoly = POLYMORPH_TYPE_PANTHER;
 | ||
|         if (nDuration >= 12)
 | ||
|         {
 | ||
|             nPoly = POLYMORPH_TYPE_DIRE_PANTHER;
 | ||
|         }
 | ||
|     }
 | ||
|     else if (nSpell == 403)
 | ||
|     {
 | ||
|         nPoly = POLYMORPH_TYPE_WOLF;
 | ||
| 
 | ||
|         if (nDuration >= 12)
 | ||
|         {
 | ||
|             nPoly = POLYMORPH_TYPE_DIRE_WOLF;
 | ||
|         }
 | ||
|     }
 | ||
|     else if (nSpell == 404)
 | ||
|     {
 | ||
|         nPoly = POLYMORPH_TYPE_BOAR;
 | ||
|         if (nDuration >= 12)
 | ||
|         {
 | ||
|             nPoly = POLYMORPH_TYPE_DIRE_BOAR;
 | ||
|         }
 | ||
|     }
 | ||
|     else if (nSpell == 405)
 | ||
|     {
 | ||
|         nPoly = POLYMORPH_TYPE_BADGER;
 | ||
|         if (nDuration >= 12)
 | ||
|         {
 | ||
|             nPoly = POLYMORPH_TYPE_DIRE_BADGER;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Determine which items get their item properties merged onto the shifters
 | ||
|     // new form.
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     int bWeapon;
 | ||
|     int bArmor;
 | ||
|     int bItems;
 | ||
|     int bCopyGlovesToClaws = FALSE;
 | ||
| 
 | ||
|     bWeapon = StringToInt(Get2DAString("polymorph","MergeW",nPoly)) == 1;
 | ||
| 
 | ||
|     if ( WS_ALWAYS_COPY_ARMOR_PROPS )
 | ||
|         bArmor = TRUE;
 | ||
|     else
 | ||
|         bArmor  = StringToInt(Get2DAString("polymorph","MergeA",nPoly)) == 1;
 | ||
| 
 | ||
|     if ( WS_ALWAYS_COPY_ITEM_PROPS )
 | ||
|         bItems = TRUE;
 | ||
|     else
 | ||
|         bItems  = StringToInt(Get2DAString("polymorph","MergeI",nPoly)) == 1;
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Send message to PC about which items get merged to this form
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     string sMerge;
 | ||
|     sMerge = "Merged: "; // <caz<61>>: This is a color code that makes the text behind it blue.
 | ||
|     if(bArmor) sMerge += "<caz<61>>Armor, Helmet, Shield";
 | ||
|     if(bItems) sMerge += ",</c> <ca<63>a>Rings, Amulet, Cloak, Boots, Belt, Bracers";
 | ||
|     if( bWeapon || WS_COPY_WEAPON_PROPS_TO_UNARMED == 1 )
 | ||
|         sMerge += ",</c> <c<>AA>Weapon";
 | ||
|     else if ( WS_COPY_WEAPON_PROPS_TO_UNARMED == 2 )
 | ||
|         sMerge += ",</c> <c<>AA>Gloves to unarmed attacks";
 | ||
|     else if (WS_COPY_WEAPON_PROPS_TO_UNARMED == 3 )
 | ||
|         sMerge += ",</c> <c<>AA>Weapon (if you had one equipped) or gloves to unarmed attacks";
 | ||
|     else
 | ||
|         sMerge += ",</c> <c<>AA>No weapon or gloves to unarmed attacks";
 | ||
|     SendMessageToPC(oTarget,sMerge + ".</c>");
 | ||
| 
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Store the old objects so we can access them after the character has
 | ||
|     // changed into his new form
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     object oWeaponOld;
 | ||
|     object oArmorOld;
 | ||
|     object oRing1Old ;
 | ||
|     object oRing2Old;
 | ||
|     object oAmuletOld;
 | ||
|     object oCloakOld ;
 | ||
|     object oBootsOld  ;
 | ||
|     object oBeltOld   ;
 | ||
|     object oHelmetOld;
 | ||
|     object oShield ;
 | ||
|     object oBracerOld;
 | ||
|     object oHideOld;
 | ||
| 
 | ||
|     int nServerSaving = GetLocalInt(OBJECT_SELF, "GW_ServerSave");
 | ||
|     if(nServerSaving != TRUE)
 | ||
|     {
 | ||
|         //if not polymorphed get items worn and store on player.
 | ||
|         oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF);
 | ||
|         oArmorOld  = GetItemInSlot(INVENTORY_SLOT_CHEST,OBJECT_SELF);
 | ||
|         oRing1Old  = GetItemInSlot(INVENTORY_SLOT_LEFTRING,OBJECT_SELF);
 | ||
|         oRing2Old  = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,OBJECT_SELF);
 | ||
|         oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,OBJECT_SELF);
 | ||
|         oCloakOld  = GetItemInSlot(INVENTORY_SLOT_CLOAK,OBJECT_SELF);
 | ||
|         oBootsOld  = GetItemInSlot(INVENTORY_SLOT_BOOTS,OBJECT_SELF);
 | ||
|         oBeltOld   = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF);
 | ||
|         oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF);
 | ||
|         oShield    = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,OBJECT_SELF);
 | ||
|         oBracerOld  = GetItemInSlot(INVENTORY_SLOT_ARMS,OBJECT_SELF);
 | ||
|         oHideOld = GetItemInSlot(INVENTORY_SLOT_CARMOUR,OBJECT_SELF);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldWeapon",oWeaponOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldArmor",oArmorOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldRing1",oRing1Old);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldRing2",oRing2Old);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldAmulet",oAmuletOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldCloak",oCloakOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBoots",oBootsOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBelt",oBeltOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldHelmet",oHelmetOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldBracer",oBracerOld);
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldHide",oHideOld);
 | ||
|         if (GetIsObjectValid(oShield))
 | ||
|         {
 | ||
|             if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
 | ||
|                 GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD &&
 | ||
|                 GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD)
 | ||
|             {
 | ||
|                 oShield = OBJECT_INVALID;
 | ||
|             }
 | ||
|         }
 | ||
|         SetLocalObject(OBJECT_SELF,"GW_OldShield",oShield);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         //If server saving use items stored earlier.
 | ||
|         oWeaponOld =     GetLocalObject(OBJECT_SELF,"GW_OldWeapon");
 | ||
|         oArmorOld  =     GetLocalObject(OBJECT_SELF,"GW_OldArmor");
 | ||
|         oRing1Old  =     GetLocalObject(OBJECT_SELF,"GW_OldRing1");
 | ||
|         oRing2Old  =     GetLocalObject(OBJECT_SELF,"GW_OldRing2");
 | ||
|         oAmuletOld =     GetLocalObject(OBJECT_SELF,"GW_OldAmulet");
 | ||
|         oCloakOld  =     GetLocalObject(OBJECT_SELF,"GW_OldCloak");
 | ||
|         oBootsOld  =     GetLocalObject(OBJECT_SELF,"GW_OldBoots");
 | ||
|         oBeltOld   =     GetLocalObject(OBJECT_SELF,"GW_OldBelt");
 | ||
|         oHelmetOld =     GetLocalObject(OBJECT_SELF,"GW_OldHelmet");
 | ||
|         oShield    =     GetLocalObject(OBJECT_SELF,"GW_OldShield");
 | ||
|         oBracerOld =     GetLocalObject(OBJECT_SELF,"GW_OldBracer");
 | ||
|         oHideOld   =     GetLocalObject(OBJECT_SELF,"GW_OldHide");
 | ||
|         SetLocalInt(OBJECT_SELF, "GW_ServerSave", FALSE);
 | ||
|     }
 | ||
| 
 | ||
|     ePoly = EffectPolymorph(nPoly);
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // Iznoghoud: Handle stacking item properties here.
 | ||
|     ePoly = AddStackablePropertiesToPoly ( OBJECT_SELF, ePoly, bWeapon, bItems, bArmor, oArmorOld, oRing1Old, oRing2Old, oAmuletOld, oCloakOld, oBracerOld, oBootsOld, oBeltOld, oHelmetOld, oShield, oWeaponOld, oHideOld);
 | ||
|     //--------------------------------------------------------------------------
 | ||
| 
 | ||
|     ePoly = ExtraordinaryEffect(ePoly);
 | ||
|     //Fire cast spell at event for the specified target
 | ||
|     SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_WILD_SHAPE, FALSE));
 | ||
| 
 | ||
|     //Apply the VFX impact and effects
 | ||
|     ClearAllActions(); // prevents an exploit
 | ||
|     ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
 | ||
|     ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePoly, OBJECT_SELF, HoursToSeconds(nDuration));
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // 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 oClawLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,OBJECT_SELF);
 | ||
|     object oClawRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,OBJECT_SELF);
 | ||
|     object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,OBJECT_SELF);
 | ||
| 
 | ||
|     //identify weapon
 | ||
|     SetIdentified(oWeaponNew, TRUE);
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Weapons
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bWeapon)
 | ||
|     {
 | ||
|         //------------------------------------------------------------------
 | ||
|         // Merge weapon properties...
 | ||
|         //------------------------------------------------------------------
 | ||
|         WildshapeCopyWeaponProperties(oTarget, oWeaponOld,oWeaponNew);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         switch ( GW_COPY_WEAPON_PROPS_TO_UNARMED )
 | ||
|         {
 | ||
|         case 1: // Copy over weapon properties to claws/bite
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oClawLeft, TRUE);
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oClawRight, TRUE);
 | ||
|             WildshapeCopyNonStackProperties(oWeaponOld,oBite, TRUE);
 | ||
|             break;
 | ||
|         case 2: // Copy over glove properties to claws/bite
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oClawLeft, FALSE);
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oClawRight, FALSE);
 | ||
|             WildshapeCopyNonStackProperties(oBracerOld,oBite, FALSE);
 | ||
|             bCopyGlovesToClaws = TRUE;
 | ||
|             break;
 | ||
|         case 3: // Copy over weapon properties to claws/bite if wearing a weapon, otherwise copy gloves
 | ||
|             if ( GetIsObjectValid(oWeaponOld) )
 | ||
|             {
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oClawLeft, TRUE);
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oClawRight, TRUE);
 | ||
|                 WildshapeCopyNonStackProperties(oWeaponOld,oBite, TRUE);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oClawLeft, FALSE);
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oClawRight, FALSE);
 | ||
|                 WildshapeCopyNonStackProperties(oBracerOld,oBite, FALSE);
 | ||
|                 bCopyGlovesToClaws = TRUE;
 | ||
|             }
 | ||
|             break;
 | ||
|         default: // Do not copy over anything
 | ||
|             break;
 | ||
|         };
 | ||
|     }
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Armor
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bArmor)
 | ||
|     {
 | ||
|         //----------------------------------------------------------------------
 | ||
|         // Merge item properties from armor and helmet...
 | ||
|         //----------------------------------------------------------------------
 | ||
|         WildshapeCopyNonStackProperties(oArmorOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oHelmetOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oShield,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oHideOld,oArmorNew);
 | ||
|     }
 | ||
| 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     // ...Magic Items
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     if (bItems)
 | ||
|     {
 | ||
|         //----------------------------------------------------------------------
 | ||
|         // Merge item properties from from rings, amulets, cloak, boots, belt
 | ||
|         //----------------------------------------------------------------------
 | ||
|         WildshapeCopyNonStackProperties(oRing1Old,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oRing2Old,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oAmuletOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oCloakOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oBootsOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oBeltOld,oArmorNew);
 | ||
|         WildshapeCopyNonStackProperties(oBracerOld,oArmorNew);
 | ||
|     }
 | ||
| 
 | ||
| }
 |