#include "prc_inc_stunfist" #include "prc_inc_sp_tch" #include "prc_sp_func" void main() { object oPC = OBJECT_SELF; object oTarget = PRCGetSpellTargetObject(); effect eNone; // should be in melee range if(!GetIsInMeleeRange(oTarget, oPC)) { SendMessageToPC(oPC, "You are not close enough to your target to attack!"); // move into range so we can attack next round AssignCommand(oPC, ActionAttack(oTarget)); return; } if(!GetIsUnarmed(oPC)) { SendMessageToPC(oPC, "You need to be unarmed for this ability!"); // be nice and have you get a normal full attack round PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget)); return; } int nSpellID = GetLocalInt(oPC, "EF_REAL_SPELL_CURRENT"); int nSpellbookID = GetLocalInt(oPC, "EF_SPELL_CURRENT"); string sArray = GetLocalString(oPC, "EF_SPELL_CURRENT"); int nUses = sArray == "" ? GetHasSpell(nSpellbookID, oPC) : persistant_array_get_int(oPC, sArray, nSpellbookID); if(!nUses) { SendMessageToPC(oPC, "No uses or preperations left for selected spell!"); // be nice and have you get a normal full attack round PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget)); return; } if(!IsTouchSpell(nSpellID) && !GetHasFeat(FEAT_EF_HOLD_RAY, oPC)) { SendMessageToPC(oPC, "Selected spell is not a touch spell!"); // be nice and have you get a normal full attack round PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget)); return; } if(!IsTouchSpell(nSpellID) && !IsRaySpell(nSpellID) && GetHasFeat(FEAT_EF_HOLD_RAY, oPC)) { SendMessageToPC(oPC, "Selected spell is not a touch or ray spell!"); // be nice and have you get a normal full attack round PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget)); return; } // expend stunning fist use if (!ExpendStunfistUses(oPC, 1)) { // be nice and have you get a normal full attack round PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget)); return; } // expend spell use if(sArray == "") { DecrementRemainingSpellUses(oPC, nSpellbookID); } else { nUses--; persistant_array_set_int(oPC, sArray, nSpellbookID, nUses); } // setup for holding the charge int iOldHold = GetLocalInt(oPC, PRC_SPELL_HOLD); int iOldHoldRay = GetLocalInt(oPC, "PRC_SPELL_HOLD_RAY"); SetLocalInt(oPC, PRC_SPELL_HOLD, TRUE); SetLocalInt(oPC, "PRC_EF_ARCANE_FIST", TRUE); SetLocalInt(oPC, PRC_CASTERCLASS_OVERRIDE, GetPrimaryArcaneClass(oPC)); SendMessageToPC(oPC, "Arcane Fist:" + IntToString(nSpellID)); // run spell script to hold charge RunImpactScript(oPC, nSpellID, 0); SetLocalInt(oPC, PRC_SPELL_HOLD, iOldHold); DeleteLocalInt(oPC, "PRC_EF_ARCANE_FIST"); DeleteLocalInt(oPC, PRC_CASTERCLASS_OVERRIDE); PerformAttackRound(oTarget, oPC, eNone); AssignCommand(oPC, ActionAttack(oTarget, TRUE)); }