Amon_PRC8/_module/nss/mc_it_quickslot.nss
Jaysyn904 c5cffc37af Initial Commit
Initial Commit [v1.01]
2025-04-03 19:00:46 -04:00

135 lines
4.7 KiB
Plaintext

#include "x2_inc_switches"
//#include "prc_inc_spells"
const int nMaxSpells = 20;
void FireSpells();
int AddSpell(object oSpellGem);
string GetMetaMagicString(int iMetaMagic);
void main() {
int nEvent =GetUserDefinedItemEventNumber();
object oPC;
object oItem;
if (nEvent == X2_ITEM_EVENT_SPELLCAST_AT) {
oItem = GetSpellTargetObject();
if (GetIsObjectValid(oItem) && GetObjectType(oItem) == OBJECT_TYPE_ITEM && GetTag(oItem) == "MC_IT_QUICKSLOT") {
AddSpell(oItem);
SetModuleOverrideSpellScriptFinished();
}
}
// * This code runs when the Unique Power property of the item is used
// * Note that this event fires PCs only
else if (nEvent == X2_ITEM_EVENT_ACTIVATE) {
// else if (nEvent == MOD_ONACTIVATE) {
FireSpells();
}
// unacquiring clears the stored spells
else if (nEvent == X2_ITEM_EVENT_UNACQUIRE) {
// else if (nEvent == PWS_ONUNACQUIRE) {
oItem = GetModuleItemLost();
int i;
for (i = 1; i<= nMaxSpells; i++) {
DeleteLocalInt(oItem, "X2_L_SPELLTRIGGER" + IntToString(i));
DeleteLocalInt(oItem, "X2_L_METAMAGIC" + IntToString(i));
DeleteLocalInt(oItem, "X2_L_NUMTRIGGERS");
}
SetName(oItem, "");
}
}
void FireSpells() {
object oItem = GetItemActivated();
object oPC = GetItemActivator();
int i = 0;
int nSpellId = -1;
int nMode = GetSpellId();
int iMax = GetLocalInt(oItem, "X2_L_NUMTRIGGERS");
int iMetaMagic;
if (iMax < 1) {
FloatingTextStrRefOnCreature(83886, oPC); // no spells stored
return;
}
int bSuccess = FALSE;
AssignCommand(oPC, ClearAllActions(TRUE));
for (i = 1; i <= iMax; i++) {
nSpellId = GetLocalInt(oItem, "X2_L_SPELLTRIGGER" + IntToString(i));
if (nSpellId > 0) {
bSuccess = TRUE;
iMetaMagic = GetLocalInt(oItem, "X2_L_METAMAGIC" + IntToString(i));
nSpellId --; // I added +1 to the spellID when the sequencer was created, so I have to remove it here
DelayCommand(IntToFloat(i), AssignCommand(oPC, ActionCastSpellAtObject(nSpellId, oPC, iMetaMagic, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE)));
}
}
}
int AddSpell(object oSpellGem) {
object oPC = GetLastSpellCaster();
// Does the Gem already have the maximum amount of spells stored
int nNumSpells = GetLocalInt(oSpellGem, "X2_L_NUMTRIGGERS");
if (nNumSpells >= nMaxSpells) {
FloatingTextStringOnCreature("This spell gem is full, no more spells may be added to it.", oPC);
return FALSE;
}
else {
// spell cannot be cast from an item
if (GetIsObjectValid(GetSpellCastItem())) {
FloatingTextStringOnCreature("Cannot use one object to enchant another.", oPC);
return FALSE;
}
// Check if the spell is marked as hostile in spells.2da
int nHostile = StringToInt(Get2DAString("spells","HostileSetting",GetSpellId()));
if (nHostile == 1) {
FloatingTextStringOnCreature("Cannot store offensive spells!", oPC);
return FALSE; // no hostile spells on sequencers, sorry ya munchkins :)
}
// success visual and store spell-id on item.
effect eVisual = EffectVisualEffect(VFX_IMP_BREACH);
nNumSpells++;
//NOTE: I add +1 to the SpellId to spell 0 can be used to trap failure
int nSID = GetSpellId()+1;
int iMetaMagic = GetMetaMagicFeat();
SetLocalInt(oSpellGem, "X2_L_SPELLTRIGGER" + IntToString(nNumSpells), nSID);
SetLocalInt(oSpellGem, "X2_L_METAMAGIC" + IntToString(nNumSpells), iMetaMagic);
SetLocalInt(oSpellGem, "X2_L_NUMTRIGGERS", nNumSpells);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPC);
FloatingTextStringOnCreature("Spell Stored", oPC);
if (nNumSpells == 1) {
SetName(oSpellGem, GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSID-1))) + GetMetaMagicString(iMetaMagic) + "\n");
}
else {
SetName(oSpellGem, GetName(oSpellGem) + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSID-1))) + GetMetaMagicString(iMetaMagic) + "\n");
}
}
return TRUE;
}
string GetMetaMagicString(int iMetaMagic) {
switch (iMetaMagic) {
case METAMAGIC_NONE : return ""; break;
case METAMAGIC_EMPOWER : return " (Empowered) "; break;
case METAMAGIC_EXTEND : return " (Extended) "; break;
case METAMAGIC_MAXIMIZE : return " (Maximized) "; break;
case METAMAGIC_QUICKEN : return " (Quickened) "; break;
case METAMAGIC_SILENT : return " (Silenced) "; break;
case METAMAGIC_STILL : return " (Stilled) "; break;
}
return "";
}