private void ApplyNPCEffect(NWCreature caster, NWCreature target, int customEffectID, int ticks, int effectiveLevel, string data) { Data.Entity.CustomEffect effectEntity = _data.Single <Data.Entity.CustomEffect>(x => x.ID == customEffectID); // Look for existing effect. var spellModel = _cache.NPCEffects.SingleOrDefault(x => x.Key.Caster.Equals(caster) && x.Key.CustomEffectID == customEffectID && x.Key.Target.Equals(target)).Key; if (spellModel == null) { spellModel = new CasterSpellVO { Caster = caster, CustomEffectID = customEffectID, EffectName = effectEntity.Name, Target = target, EffectiveLevel = effectiveLevel }; _cache.NPCEffects.Add(spellModel, 0); } if (spellModel.EffectiveLevel > effectiveLevel) { caster.SendMessage("A more powerful effect already exists on your target."); return; } App.ResolveByInterface <ICustomEffect>("CustomEffect." + effectEntity.ScriptHandler, handler => { if (string.IsNullOrWhiteSpace(data)) { data = handler?.Apply(caster, target, effectiveLevel); } if (string.IsNullOrWhiteSpace(data)) { data = string.Empty; } spellModel.Data = data; _cache.NPCEffects[spellModel] = ticks; }); }
public void OnModuleHeartbeat() { foreach (var entry in _state.NPCEffects) { CasterSpellVO casterModel = entry.Key; _state.NPCEffects[entry.Key] = entry.Value - 1; Data.Entities.CustomEffect entity = _db.CustomEffects.Single(x => x.CustomEffectID == casterModel.CustomEffectID); ICustomEffect handler = App.ResolveByInterface <ICustomEffect>("CustomEffect." + entity.ScriptHandler); try { handler?.Tick(casterModel.Caster, casterModel.Target); } catch (Exception ex) { _error.LogError(ex, "OnModuleHeartbeat was unable to run specific effect script: " + entity.ScriptHandler); } // 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) { _state.EffectsToRemove.Add(entry.Key); handler?.WearOff(casterModel.Caster, casterModel.Target); 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); } } foreach (CasterSpellVO entry in _state.EffectsToRemove) { _state.NPCEffects.Remove(entry); } _state.EffectsToRemove.Clear(); }
private static void ApplyNPCEffect(NWCreature caster, NWCreature target, int customEffectID, int ticks, int effectiveLevel, string data) { Data.Entity.CustomEffect effectEntity = DataService.CustomEffect.GetByID(customEffectID); // Look for existing effect. var spellModel = AppCache.NPCEffects.SingleOrDefault(x => x.Key.Caster.Equals(caster) && x.Key.CustomEffectID == customEffectID && x.Key.Target.Equals(target)).Key; if (spellModel == null) { spellModel = new CasterSpellVO { Caster = caster, CustomEffectID = customEffectID, EffectName = effectEntity.Name, Target = target, EffectiveLevel = effectiveLevel }; AppCache.NPCEffects.Add(spellModel, 0); } if (spellModel.EffectiveLevel > effectiveLevel) { caster.SendMessage("A more powerful effect already exists on your target."); return; } ICustomEffectHandler handler = GetCustomEffectHandler(customEffectID); if (string.IsNullOrWhiteSpace(data)) { data = handler?.Apply(caster, target, effectiveLevel); } if (string.IsNullOrWhiteSpace(data)) { data = string.Empty; } spellModel.Data = data; AppCache.NPCEffects[spellModel] = ticks; }
private void ProcessNPCCustomEffects() { for (int index = _cache.NPCEffects.Count - 1; index >= 0; index--) { var entry = _cache.NPCEffects.ElementAt(index); CasterSpellVO casterModel = entry.Key; _cache.NPCEffects[entry.Key] = entry.Value - 1; Data.Entity.CustomEffect entity = _data.Single <Data.Entity.CustomEffect>(x => x.ID == casterModel.CustomEffectID); App.ResolveByInterface <ICustomEffect>("CustomEffect." + entity.ScriptHandler, (handler) => { try { handler?.Tick(casterModel.Caster, casterModel.Target, _cache.NPCEffects[entry.Key], casterModel.EffectiveLevel, casterModel.Data); } catch (Exception ex) { _error.LogError(ex, "CustomEffectService processor was unable to run specific effect script: " + entity.ScriptHandler); } // 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); _cache.NPCEffects.Remove(entry.Key); } }); } }
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.CustomEffect.GetByID(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); } } }
public void ApplyCustomEffect(NWCreature oCaster, NWCreature oTarget, int customEffectID, int ticks, int effectLevel) { // Can't apply the effect if the existing one is stronger. int existingEffectLevel = GetActiveEffectLevel(oTarget, customEffectID); if (existingEffectLevel > effectLevel) { oCaster.SendMessage("A more powerful effect already exists on your target."); return; } Data.Entities.CustomEffect effectEntity = _db.CustomEffects.Single(x => x.CustomEffectID == customEffectID); // PC custom effects are tracked in the database. if (oTarget.IsPlayer) { PCCustomEffect entity = _db.PCCustomEffects.SingleOrDefault(x => x.PlayerID == oTarget.GlobalID && x.CustomEffectID == customEffectID); if (entity == null) { entity = new PCCustomEffect { PlayerID = oTarget.GlobalID, CustomEffectID = customEffectID }; _db.PCCustomEffects.Add(entity); } entity.Ticks = ticks; _db.SaveChanges(); oTarget.SendMessage(effectEntity.StartMessage); } // NPCs custom effects are tracked in server memory. else { // Look for existing effect. foreach (var entry in _state.NPCEffects) { CasterSpellVO casterSpellModel = entry.Key; if (casterSpellModel.Caster.Equals(oCaster) && casterSpellModel.CustomEffectID == customEffectID && casterSpellModel.Target.Equals(oTarget)) { _state.NPCEffects[entry.Key] = ticks; return; } } // Didn't find an existing effect. Create a new one. CasterSpellVO spellModel = new CasterSpellVO { Caster = oCaster, CustomEffectID = customEffectID, EffectName = effectEntity.Name, Target = oTarget }; _state.NPCEffects[spellModel] = ticks; } ICustomEffect handler = App.ResolveByInterface <ICustomEffect>("CustomEffect." + effectEntity.ScriptHandler); handler?.Apply(oCaster, oTarget); oTarget.SetLocalInt("CUSTOM_EFFECT_ACTIVE_" + customEffectID, effectLevel); }