public bool DoesPCHaveCustomEffectByCategory(NWPlayer player, CustomEffectCategoryType category) { var pcEffect = _data.GetAll <PCCustomEffect>().FirstOrDefault(x => { var customEffect = _data.Get <Data.Entity.CustomEffect>(x.CustomEffectID); return(customEffect.CustomEffectCategoryID == (int)category); }); return(pcEffect != null); }
private void ApplyPCEffect(NWCreature caster, NWCreature target, int customEffectID, int ticks, int effectiveLevel, string data) { Data.Entity.CustomEffect customEffect = _data.Single <Data.Entity.CustomEffect>(x => x.ID == customEffectID); PCCustomEffect pcEffect = _data.SingleOrDefault <PCCustomEffect>(x => x.PlayerID == target.GlobalID && x.CustomEffectID == customEffectID); CustomEffectCategoryType category = (CustomEffectCategoryType)customEffect.CustomEffectCategoryID; if (category == CustomEffectCategoryType.FoodEffect) { var customEffectPC = _data.Get <Data.Entity.CustomEffect>(pcEffect.CustomEffectID); if (pcEffect != null && customEffectPC.CustomEffectCategoryID == (int)category) { caster.SendMessage("You are not hungry."); return; } } DatabaseActionType action = DatabaseActionType.Update; if (pcEffect == null) { pcEffect = new PCCustomEffect { PlayerID = target.GlobalID }; action = DatabaseActionType.Insert; } if (pcEffect.EffectiveLevel > effectiveLevel) { caster.SendMessage("A more powerful effect already exists on your target."); return; } pcEffect.CustomEffectID = customEffectID; pcEffect.EffectiveLevel = effectiveLevel; pcEffect.Ticks = ticks; pcEffect.CasterNWNObjectID = _.ObjectToString(caster); _data.SubmitDataChange(pcEffect, action); target.SendMessage(customEffect.StartMessage); App.ResolveByInterface <ICustomEffect>("CustomEffect." + customEffect.ScriptHandler, handler => { if (string.IsNullOrWhiteSpace(data)) { data = handler?.Apply(caster, target, effectiveLevel); } if (string.IsNullOrWhiteSpace(data)) { data = string.Empty; } pcEffect.Data = data; _data.SubmitDataChange(pcEffect, DatabaseActionType.Update); // Was already queued for removal, but got cast again. Take it out of the list to be removed. if (_cache.PCEffectsForRemoval.Contains(pcEffect.ID)) { _cache.PCEffectsForRemoval.Remove(pcEffect.ID); } }); }
private static void ApplyPCEffect(NWCreature caster, NWCreature target, int customEffectID, int ticks, int effectiveLevel, string data) { PCCustomEffect pcEffect = DataService.PCCustomEffect.GetByPlayerIDAndCustomEffectIDOrDefault(target.GlobalID, customEffectID); ICustomEffectHandler handler = GetCustomEffectHandler(customEffectID); CustomEffectCategoryType category = handler.CustomEffectCategoryType; if (category == CustomEffectCategoryType.FoodEffect) { var customEffectPC = DataService.CustomEffect.GetByID(pcEffect.CustomEffectID); if (customEffectPC != null) { var foodHandler = GetCustomEffectHandler(customEffectPC.ID); if (foodHandler.CustomEffectCategoryType == category) { caster.SendMessage("You are not hungry."); } return; } } DatabaseActionType action = DatabaseActionType.Update; if (pcEffect == null) { pcEffect = new PCCustomEffect { PlayerID = target.GlobalID }; action = DatabaseActionType.Insert; } if (pcEffect.EffectiveLevel > effectiveLevel) { caster.SendMessage("A more powerful effect already exists on your target."); return; } pcEffect.CustomEffectID = customEffectID; pcEffect.EffectiveLevel = effectiveLevel; pcEffect.Ticks = ticks; pcEffect.CasterNWNObjectID = _.ObjectToString(caster); DataService.SubmitDataChange(pcEffect, action); target.SendMessage(handler.StartMessage); if (string.IsNullOrWhiteSpace(data)) { data = handler?.Apply(caster, target, effectiveLevel); } if (string.IsNullOrWhiteSpace(data)) { data = string.Empty; } pcEffect.Data = data; DataService.SubmitDataChange(pcEffect, DatabaseActionType.Update); // Was already queued for removal, but got cast again. Take it out of the list to be removed. if (AppCache.PCEffectsForRemoval.Contains(pcEffect.ID)) { AppCache.PCEffectsForRemoval.Remove(pcEffect.ID); } }