Here's what I've been able to find in the source as far as procs go:
zone/attack.cpp
Code:
1077 ////////////////////////////////////////////////////////////
1078 //////// PROC CODE
1079 //////// Kaiyodo - Check for proc on weapon based on DEX
1080 ///////////////////////////////////////////////////////////
1081 if(other->GetHP() > -10 && !bRiposte && !IsDead()) {
1082 TryWeaponProc(weapon, other);
1083 }
and
further down, in
Mob::TryWeaponProc
Code:
2596 uint32 i;
2597 for(i = 0; i < MAX_PROCS; i++) {
2598 if (PermaProcs[i].spellID != SPELL_UNKNOWN) {
2599 if(MakeRandomInt(0, 100) < PermaProcs[i].chance) {
2600 mlog(COMBAT__PROCS, "Permanent proc %d procing spell %d (%d percent chance)", i, PermaProcs[i].spellID, PermaProcs[i].chance);
2601 ExecWeaponProc(PermaProcs[i].spellID, on);
2602 } else {
2603 mlog(COMBAT__PROCS, "Permanent proc %d failed to proc %d (%d percent chance)", i, PermaProcs[i].spellID, PermaProcs[i].chance);
2604 }
2605 }
2606 if (SpellProcs[i].spellID != SPELL_UNKNOWN) {
2607 int chance = ProcChance + SpellProcs[i].chance;
2608 if(MakeRandomInt(0, 100) < chance) {
2609 mlog(COMBAT__PROCS, "Spell proc %d procing spell %d (%d percent chance)", i, SpellProcs[i].spellID, chance);
2610 ExecWeaponProc(SpellProcs[i].spellID, on);
2611 } else {
2612 mlog(COMBAT__PROCS, "Spell proc %d failed to proc %d (%d percent chance)", i, SpellProcs[i].spellID, chance);
2613 }
2614 }
2615 }
I'm wondering if SpellProcs is only set in the zone process itself, and not carried from zone-to-zone. That could explain why it happens when you cast it in the same zone. And since weapons are checked pretty much every hit, on-weapon procs are fine.
However, if that's the problem, I'm not really sure what the best fix would be... Maybe adding a hack somewhere to check & see if it's defined?