Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
| 18/02/19 by Stratovarius
 | |
| 
 | |
| Ephemeral Image
 | |
| 
 | |
| Master, Dark Metamorphosis 
 | |
| Level/School: 7th/Illusion (Shadow) 
 | |
| Effect: One shadow duplicate 
 | |
| Duration: 1 minute/level (D) 
 | |
| Saving Throw: None 
 | |
| Spell Resistance: No
 | |
| 
 | |
| You detach your own shadow and animate it with extraplanar energies, creating a dark-hued, hazy duplicate of yourself.
 | |
| 
 | |
| This mystery functions like the spell project image, except as noted above. In addition, the image that you project has concealment.
 | |
| 
 | |
| 
 | |
| This is a direct copy of Baelnorn Projection
 | |
| */
 | |
| 
 | |
| #include "prc_alterations"
 | |
| 
 | |
| const float DROP_DELAY = 2.0f;
 | |
| 
 | |
| // A pseudo-hb function that checks if the item has been dropped yet
 | |
| // If it hasn't, clears action queue and queues another drop.
 | |
| void CheckIsDropped(object oCreature, object oItem)
 | |
| {
 | |
| 	if(DEBUG) DoDebug("shd_myst_ei_evnt: CheckIsDropped()");
 | |
| 	
 | |
|     if(GetItemPossessor(oItem) == oCreature)
 | |
|     {
 | |
| 	    if(DEBUG) DoDebug("shd_myst_ei_evnt:GetItemPosessor(oItem) == oCreature");
 | |
|         // No check for commandability here. Let's not break any cutscenes
 | |
|         // If cheating does occur, set the char to commandable first here.
 | |
|         //And remember to restore the setting.
 | |
| 
 | |
|         AssignCommand(oCreature, ClearAllActions());
 | |
|         AssignCommand(oCreature, ActionPutDownItem(oItem));
 | |
| 
 | |
|         DelayCommand(DROP_DELAY, CheckIsDropped(oCreature, oItem));
 | |
|     }
 | |
| }
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     int nEvent = GetRunningEvent();
 | |
|     object oShadow, oItem;
 | |
| if(DEBUG) DoDebug("shd_myst_ei_evnt running, event = " + IntToString(nEvent));
 | |
|     switch(nEvent)
 | |
|     {
 | |
|         // Nerf equipped weapons
 | |
|         case EVENT_ONPLAYEREQUIPITEM:
 | |
|             oShadow   = GetItemLastEquippedBy();
 | |
|             oItem = GetItemLastEquipped();
 | |
| if(DEBUG) DoDebug("Equipped item, nerfing:"
 | |
|                 + "oShadow = " + DebugObject2Str(oItem) + "\n"
 | |
|                 + "oItem = " + DebugObject2Str(oItem) + "\n"
 | |
|                   );
 | |
|             if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem))
 | |
|             {
 | |
|                 AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyNoDamage(), oItem);
 | |
|                 array_set_object(oShadow, "PRC_EphemeralImage_Nerfed", array_get_size(oShadow, "PRC_EphemeralImage_Nerfed"), oItem);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         /*case EVENT_ONPLAYERUNEQUIPITEM:
 | |
|             break;*/
 | |
|         case EVENT_ONACQUIREITEM:
 | |
|             oShadow   = GetModuleItemAcquiredBy();
 | |
|             oItem = GetModuleItemAcquired();
 | |
| 
 | |
|             AssignCommand(oShadow, ActionPutDownItem(oItem));
 | |
|             DelayCommand(DROP_DELAY, CheckIsDropped(oShadow, oItem));
 | |
| 
 | |
|             break;
 | |
|         /*case EVENT_ONUNAQUIREITEM:
 | |
|             break;*/
 | |
|         case EVENT_ONPLAYERREST_STARTED:
 | |
|             oShadow = GetLastBeingRested();
 | |
| 
 | |
|             // Signal the projection monitoring HB
 | |
|             SetLocalInt(oShadow, "PRC_EphemeralImage_Abort", TRUE);
 | |
|             break;
 | |
|             
 | |
|         case EVENT_ONCLIENTENTER:
 | |
|              object oShadow = GetEnteringObject();
 | |
|              
 | |
|              // Remove eventhooks
 | |
|              RemoveEventScript(oShadow, EVENT_ONPLAYEREQUIPITEM,    "shd_myst_ei_evnt", TRUE, FALSE); // OnEquip
 | |
|              RemoveEventScript(oShadow, EVENT_ONACQUIREITEM,        "shd_myst_ei_evnt", TRUE, FALSE); // OnAcquire
 | |
|              RemoveEventScript(oShadow, EVENT_ONPLAYERREST_STARTED, "shd_myst_ei_evnt", FALSE, FALSE); // OnRest
 | |
|              RemoveEventScript(oShadow, EVENT_ONCLIENTENTER,        "shd_myst_ei_evnt", TRUE, FALSE); //OnClientEnter           
 | |
| 
 | |
|         /*default:
 | |
|             if(DEBUG) DoDebug("shd_myst_ei_evnt: ERROR: Called for unhandled event: " + IntToString(nEvent));
 | |
|             return;*/
 | |
|     }
 | |
| }
 | |
| 
 |