/* Disenchanter Mask Descriptors: Light Classes: Totemist Chakra: Brow (Totem) Saving Throw: None Chakra Bind (Totem) Your face lengthens and shapes into the mask you wear, and the dangling tongue of the mask becomes your own tongue. As you extend it, you can practically taste magic in the air, and when you use the tongue to drain magic, it tastes strong and sweet, almost like a liqueur. You can use the long tongue of your disenchanter mask to make a melee touch attack as a standard action. If it hits, you suppress the opponent's primary weapon, if any, for ten rounds. */ #include "moi_inc_moifunc" #include "prc_inc_sp_tch" void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats); object GetChest(object oCreature) { object oChest = GetObjectByTag("npf_chest" + ObjectToString(oCreature)); if(oChest == OBJECT_INVALID) { object oWP = GetWaypointByTag("npf_wp_chest_sp"); oChest = CreateObject(OBJECT_TYPE_PLACEABLE, "npf_keep_chest", GetLocation(oWP), FALSE, "npf_chest" + ObjectToString(oCreature)); } return oChest; } void RemoveAllProperties(object oItem, object oPC) { if(DEBUG) DoDebug("ture_utr_supitem: About to remove properties from item: " + DebugObject2Str(oItem)); if(oItem == OBJECT_INVALID) return; int nType = GetBaseItemType(oItem); if(nType == BASE_ITEM_TORCH || nType == BASE_ITEM_TRAPKIT || nType == BASE_ITEM_HEALERSKIT || nType == BASE_ITEM_GRENADE || nType == BASE_ITEM_THIEVESTOOLS || nType == BASE_ITEM_CRAFTMATERIALMED || nType == BASE_ITEM_CRAFTMATERIALSML || nType == 112)//craftbase return; object oWP = GetWaypointByTag("npf_wp_chest_sp"); // Generate UID int nKey = GetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter") + 1; SetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter", nKey); string sKey = IntToString(nKey); if(DEBUG) DoDebug("prc_pow_npfent: Removing itemproperties from item " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' of creature " + DebugObject2Str(oPC)); //object oChest = GetChest(oPC); //object oCopy = CopyObject(oItem, GetLocation(oChest), oChest); // copying original item to a secluded waypoint in the area // and giving it a tag that contains the key string object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "npf_item" + sKey); //storing the key value on the original item (key value would point to the copy item) SetLocalString(oItem, "PRC_NullPsionicsField_Item_UID", sKey); //SetLocalObject(oItem, "ITEM_CHEST", oChest); // so the chest can be found //SetLocalObject(oChest, sKey, oCopy); // and referenced in the chest // Stripping original item from all properties itemproperty ip = GetFirstItemProperty(oItem); while(GetIsItemPropertyValid(ip)) { RemoveItemProperty(oItem, ip); ip = GetNextItemProperty(oItem); } } void RestoreAllProperties(object oItem, object oPC, int nSlot = -1) { if(DEBUG) DoDebug("psi_pow_npfext: Attempting to restore itemproperties to: " + DebugObject2Str(oItem)); if(oPC != OBJECT_INVALID) // this is a pc object that has an item in inventory slot or normal inventory { if(oItem == OBJECT_INVALID) oItem = GetItemInSlot(nSlot, oPC); if(oItem == OBJECT_INVALID) return; } //object oChest = GetLocalObject(oItem, "ITEM_CHEST"); // getting the key value - this points to the tag of the copy item string sKey = GetLocalString(oItem, "PRC_NullPsionicsField_Item_UID"); // retrieving the copy item that is in this area object oOriginalItem = GetObjectByTag("npf_item" + sKey); if(DEBUG) DoDebug("psi_pow_npfext: Restoring itemproperties to item: " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' for creature " + DebugObject2Str(oPC)); //object oOriginalItem = GetLocalObject(oChest, sKey); object oNewItem; if(oOriginalItem != OBJECT_INVALID) // item has not been restored yet { // replace current item with original IPCopyItemProperties(oOriginalItem, oItem); DestroyObject(oOriginalItem); // destroy dup item on player //DeleteLocalObject(oChest, GetResRef(oItem)); // so it won't be restored again DeleteLocalString(oItem, "PRC_NullPsionicsField_Item_UID"); } } void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats) { // Break if they fail concentration or it runs out if (GetBreakConcentrationCheck(oTrueSpeaker) || nBeats == 0) return; // Remove and restore the properties RemoveAllProperties(oTarget, GetItemPossessor(oTarget)); // Has to run before RemoveAll is called again DelayCommand(5.8, RestoreAllProperties(oTarget, GetItemPossessor(oTarget))); // Apply VFX effect eImp = EffectVisualEffect(VFX_IMP_PULSE_BOMB); SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, GetItemPossessor(oTarget)); DelayCommand(6.0, SuppressItem(oTrueSpeaker, oTarget, nBeats - 1)); } void main() { object oMeldshaper = OBJECT_SELF; object oTarget = PRCGetSpellTargetObject(); if(PRCDoMeleeTouchAttack(oTarget)) { object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget); if (GetIsObjectValid(oItem)) SuppressItem(oMeldshaper, oItem, 10); } }