void DrainTargetStrength(DaggerfallEntityBehaviour entity, int amount) { if (entity == null) { return; } EntityEffectManager targetManager = entity.GetComponent <EntityEffectManager>(); if (targetManager == null) { return; } // Find incumbent strength drain effect on target or assign new drain DrainStrength drain = targetManager.FindIncumbentEffect <DrainStrength>() as DrainStrength; if (drain == null) { // Create and assign bundle // We bypass saving throws as target already had a chance at start of payload delivery EntityEffectBundle bundle = targetManager.CreateSpellBundle(DrainStrength.EffectKey); targetManager.AssignBundle(bundle, AssignBundleFlags.BypassSavingThrows); // Find new bundle now its assigned drain = targetManager.FindIncumbentEffect <DrainStrength>() as DrainStrength; } // Increment incumbent drain magnitude on target if (drain != null) { drain.IncreaseMagnitude(amount); } }
public override PayloadCallbackResults?EnchantmentPayloadCallback(EnchantmentPayloadFlags context, EnchantmentParam?param = null, DaggerfallEntityBehaviour sourceEntity = null, DaggerfallEntityBehaviour targetEntity = null, DaggerfallUnityItem sourceItem = null, int sourceDamage = 0) { base.EnchantmentPayloadCallback(context, param, sourceEntity, targetEntity, sourceItem); // Validate if (context != EnchantmentPayloadFlags.Used || sourceEntity == null || param == null) { return(null); } // Get caster effect manager EntityEffectManager effectManager = sourceEntity.GetComponent <EntityEffectManager>(); if (!effectManager) { return(null); } // Cast when used enchantment prepares a new ready spell if (!string.IsNullOrEmpty(param.Value.CustomParam)) { // TODO: Ready a custom spell bundle } else { // Ready a classic spell bundle SpellRecord.SpellRecordData spell; EffectBundleSettings bundleSettings; EntityEffectBundle bundle; if (GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(param.Value.ClassicParam, out spell)) { if (GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spell, BundleTypes.Spell, out bundleSettings)) { // Self-cast spells are all assigned directly to self, "click to cast" spells are loaded to ready spell // TODO: Support multiple ready spells so all loaded spells are launched on click bundle = new EntityEffectBundle(bundleSettings, sourceEntity); bundle.CastByItem = sourceItem; if (bundle.Settings.TargetType == TargetTypes.CasterOnly) { effectManager.AssignBundle(bundle, AssignBundleFlags.BypassSavingThrows | AssignBundleFlags.BypassChance); } else { effectManager.SetReadySpell(bundle, true); } } } } return(new PayloadCallbackResults() { durabilityLoss = durabilityLossOnUse }); }
public override PayloadCallbackResults?EnchantmentPayloadCallback(EnchantmentPayloadFlags context, EnchantmentParam?param = null, DaggerfallEntityBehaviour sourceEntity = null, DaggerfallEntityBehaviour targetEntity = null, DaggerfallUnityItem sourceItem = null, int sourceDamage = 0) { base.EnchantmentPayloadCallback(context, param, sourceEntity, targetEntity, sourceItem, sourceDamage); // Validate if (context != EnchantmentPayloadFlags.Equipped || param == null || sourceEntity == null || sourceItem == null) { return(null); } // Get caster effect manager EntityEffectManager casterManager = sourceEntity.GetComponent <EntityEffectManager>(); if (!casterManager) { return(null); } // Cast when held enchantment invokes a spell bundle that is permanent until item is removed if (!string.IsNullOrEmpty(param.Value.CustomParam)) { // TODO: Instantiate a custom spell bundle } else { // Instantiate a classic spell bundle SpellRecord.SpellRecordData spell; if (GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(param.Value.ClassicParam, out spell)) { UnityEngine.Debug.LogFormat("CastWhenHeld callback found enchantment '{0}'", spell.spellName); // Create effect bundle settings from classic spell EffectBundleSettings bundleSettings; if (GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spell, BundleTypes.HeldMagicItem, out bundleSettings)) { // Assign bundle EntityEffectBundle bundle = new EntityEffectBundle(bundleSettings, sourceEntity); bundle.FromEquippedItem = sourceItem; casterManager.AssignBundle(bundle, AssignBundleFlags.BypassSavingThrows); // Play cast sound on equip for player only if (casterManager.IsPlayerEntity) { casterManager.PlayCastSound(sourceEntity, casterManager.GetCastSoundID(bundle.Settings.ElementType)); } // TODO: Apply durability loss to equipped item on equip and over time // http://en.uesp.net/wiki/Daggerfall:Magical_Items#Durability_of_Magical_Items } } } return(null); }
protected virtual void InstantiateSpellBundle(EnchantmentParam param, DaggerfallEntityBehaviour sourceEntity, DaggerfallUnityItem sourceItem, EntityEffectManager casterManager, bool recast = false) { if (!string.IsNullOrEmpty(param.CustomParam)) { // TODO: Instantiate a custom spell bundle } else { // Instantiate a classic spell bundle SpellRecord.SpellRecordData spell; if (GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(param.ClassicParam, out spell)) { UnityEngine.Debug.LogFormat("CastWhenHeld callback found enchantment '{0}'", spell.spellName); // Create effect bundle settings from classic spell EffectBundleSettings bundleSettings; if (GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spell, BundleTypes.HeldMagicItem, out bundleSettings)) { // Assign bundle EntityEffectBundle bundle = new EntityEffectBundle(bundleSettings, sourceEntity); bundle.FromEquippedItem = sourceItem; bundle.AddRuntimeFlags(BundleRuntimeFlags.ItemRecastEnabled); casterManager.AssignBundle(bundle, AssignBundleFlags.BypassSavingThrows); // Play cast sound on equip for player only if (casterManager.IsPlayerEntity) { casterManager.PlayCastSound(sourceEntity, casterManager.GetCastSoundID(bundle.Settings.ElementType), true); } // Classic uses an item last "cast when held" effect spell cost to determine its durability loss on equip // Here, all effects are considered, as it seems more coherent to do so if (!recast) { int amount = FormulaHelper.CalculateCastingCost(spell, false); sourceItem.LowerCondition(amount, sourceEntity.Entity, sourceEntity.Entity.Items); //UnityEngine.Debug.LogFormat("CastWhenHeld degraded '{0}' by {1} durability points on equip. {2}/{3} remaining.", sourceItem.LongName, amount, sourceItem.currentCondition, sourceItem.maxCondition); } } // Store equip time as last reroll time sourceItem.timeEffectsLastRerolled = DaggerfallUnity.Instance.WorldTime.DaggerfallDateTime.ToClassicDaggerfallTime(); } } }
public override PayloadCallbackResults?EnchantmentPayloadCallback(EnchantmentPayloadFlags context, EnchantmentParam?param = null, DaggerfallEntityBehaviour sourceEntity = null, DaggerfallEntityBehaviour targetEntity = null, DaggerfallUnityItem sourceItem = null, int sourceDamage = 0) { base.EnchantmentPayloadCallback(context, param, sourceEntity, targetEntity, sourceItem, sourceDamage); // Validate if (context != EnchantmentPayloadFlags.Strikes || targetEntity == null || param == null || sourceDamage == 0) { return(null); } // Get target effect manager EntityEffectManager effectManager = targetEntity.GetComponent <EntityEffectManager>(); if (!effectManager) { return(null); } // Cast when strikes enchantment prepares a new ready spell if (!string.IsNullOrEmpty(param.Value.CustomParam)) { // TODO: Ready a custom spell bundle } else { // Ready a classic spell bundle SpellRecord.SpellRecordData spell; EffectBundleSettings bundleSettings; EntityEffectBundle bundle; if (GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(param.Value.ClassicParam, out spell)) { if (GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spell, BundleTypes.Spell, out bundleSettings)) { bundle = new EntityEffectBundle(bundleSettings, sourceEntity); effectManager.AssignBundle(bundle, AssignBundleFlags.ShowNonPlayerFailures); } } } return(new PayloadCallbackResults() { durabilityLoss = durabilityLossOnStrike }); }
void AssignPayloadToTargets() { if (payload == null || targetEntities.Count == 0) { return; } foreach (DaggerfallEntityBehaviour entityBehaviour in targetEntities) { // Target must have an effect manager component EntityEffectManager effectManager = entityBehaviour.GetComponent <EntityEffectManager>(); if (!effectManager) { continue; } // Instantiate payload bundle on target effectManager.AssignBundle(payload); } }
void InstantiateSpellBundle(EnchantmentParam param, DaggerfallEntityBehaviour sourceEntity, DaggerfallUnityItem sourceItem, EntityEffectManager casterManager) { if (!string.IsNullOrEmpty(param.CustomParam)) { // TODO: Instantiate a custom spell bundle } else { // Instantiate a classic spell bundle SpellRecord.SpellRecordData spell; if (GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(param.ClassicParam, out spell)) { UnityEngine.Debug.LogFormat("CastWhenHeld callback found enchantment '{0}'", spell.spellName); // Create effect bundle settings from classic spell EffectBundleSettings bundleSettings; if (GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spell, BundleTypes.HeldMagicItem, out bundleSettings)) { // Assign bundle EntityEffectBundle bundle = new EntityEffectBundle(bundleSettings, sourceEntity); bundle.FromEquippedItem = sourceItem; bundle.AddRuntimeFlags(BundleRuntimeFlags.ItemRecastEnabled); casterManager.AssignBundle(bundle, AssignBundleFlags.BypassSavingThrows); // Play cast sound on equip for player only if (casterManager.IsPlayerEntity) { casterManager.PlayCastSound(sourceEntity, casterManager.GetCastSoundID(bundle.Settings.ElementType), true); } // TODO: Apply durability loss to equipped item on equip // http://en.uesp.net/wiki/Daggerfall:Magical_Items#Durability_of_Magical_Items } // Store equip time as last reroll time sourceItem.timeEffectsLastRerolled = DaggerfallUnity.Instance.WorldTime.DaggerfallDateTime.ToClassicDaggerfallTime(); } } }
public void CastSpellQueue(Foe foe, DaggerfallEntityBehaviour enemyEntityBehaviour) { // Validate if (!enemyEntityBehaviour || foe == null || foe.SpellQueue == null || foeSpellQueuePosition == foe.SpellQueue.Count) { return; } // Target entity must be alive if (enemyEntityBehaviour.Entity.CurrentHealth == 0) { return; } // Get effect manager on enemy EntityEffectManager enemyEffectManager = enemyEntityBehaviour.GetComponent <EntityEffectManager>(); if (!enemyEffectManager) { return; } // Cast queued spells on foe from current position for (int i = foeSpellQueuePosition; i < foe.SpellQueue.Count; i++) { SpellReference spell = foe.SpellQueue[i]; EntityEffectBundle spellBundle = null; // Create classic or custom spell bundle if (string.IsNullOrEmpty(spell.CustomKey)) { // Get classic spell data SpellRecord.SpellRecordData spellData; if (!GameManager.Instance.EntityEffectBroker.GetClassicSpellRecord(spell.ClassicID, out spellData)) { continue; } // Create classic spell bundle settings EffectBundleSettings bundleSettings; if (!GameManager.Instance.EntityEffectBroker.ClassicSpellRecordDataToEffectBundleSettings(spellData, BundleTypes.Spell, out bundleSettings)) { continue; } // Create classic spell bundle spellBundle = new EntityEffectBundle(bundleSettings, enemyEntityBehaviour); } else { // Create custom spell bundle - must be previously registered to broker try { EntityEffectBroker.CustomSpellBundleOffer offer = GameManager.Instance.EntityEffectBroker.GetCustomSpellBundleOffer(spell.CustomKey); spellBundle = new EntityEffectBundle(offer.BundleSetttings, enemyEntityBehaviour); } catch (Exception ex) { Debug.LogErrorFormat("QuestResourceBehaviour.CastSpellQueue() could not find custom spell offer with key: {0}, exception: {1}", spell.CustomKey, ex.Message); } } // Assign spell bundle to enemy if (spellBundle != null) { enemyEffectManager.AssignBundle(spellBundle, AssignBundleFlags.BypassSavingThrows); } } // Set index positon to end of queue foeSpellQueuePosition = foe.SpellQueue.Count; }