private static PCCustomEffect RunPCCustomEffectProcess(NWPlayer oPC, PCCustomEffect effect) { NWCreature caster = oPC; if (!string.IsNullOrWhiteSpace(effect.CasterNWNObjectID)) { var obj = NWNXObject.StringToObject(effect.CasterNWNObjectID); if (obj.IsValid) { caster = obj.Object; } } if (effect.Ticks > 0) { effect.Ticks = effect.Ticks - 1; } if (effect.Ticks == 0) { return(null); } ICustomEffectHandler handler = CustomEffectService.GetCustomEffectHandler(effect.CustomEffectID); if (!string.IsNullOrWhiteSpace(handler.ContinueMessage) && effect.Ticks % 6 == 0) // Only show the message once every six seconds { oPC.SendMessage(handler.ContinueMessage); } handler?.Tick(caster, oPC, effect.Ticks, effect.EffectiveLevel, effect.Data); return(effect); }
private static void ProcessNPCCustomEffects() { for (int index = AppCache.NPCEffects.Count - 1; index >= 0; index--) { var entry = AppCache.NPCEffects.ElementAt(index); CasterSpellVO casterModel = entry.Key; AppCache.NPCEffects[entry.Key] = entry.Value - 1; Data.Entity.CustomEffect entity = DataService.Single <Data.Entity.CustomEffect>(x => x.ID == casterModel.CustomEffectID); ICustomEffectHandler handler = CustomEffectService.GetCustomEffectHandler(casterModel.CustomEffectID); try { handler?.Tick(casterModel.Caster, casterModel.Target, AppCache.NPCEffects[entry.Key], casterModel.EffectiveLevel, casterModel.Data); } catch (Exception ex) { LoggingService.LogError(ex, "CustomEffectService processor was unable to run specific effect script for custom effect ID: " + entity.ID); } // Kill the effect if it has expired, target is invalid, or target is dead. if (entry.Value <= 0 || !casterModel.Target.IsValid || casterModel.Target.CurrentHP <= -11) { handler?.WearOff(casterModel.Caster, casterModel.Target, casterModel.EffectiveLevel, casterModel.Data); if (casterModel.Caster.IsValid && casterModel.Caster.IsPlayer) { casterModel.Caster.SendMessage("Your effect '" + casterModel.EffectName + "' has worn off of " + casterModel.Target.Name); } casterModel.Target.DeleteLocalInt("CUSTOM_EFFECT_ACTIVE_" + casterModel.CustomEffectID); AppCache.NPCEffects.Remove(entry.Key); } } }