diff --git a/src/Persistence/Initialization/Skills/ReflectionEffectInitializer.cs b/src/Persistence/Initialization/Skills/ReflectionEffectInitializer.cs
new file mode 100644
index 000000000..b2cf42f30
--- /dev/null
+++ b/src/Persistence/Initialization/Skills/ReflectionEffectInitializer.cs
@@ -0,0 +1,60 @@
+//
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+//
+
+namespace MUnique.OpenMU.Persistence.Initialization.Skills;
+
+using MUnique.OpenMU.AttributeSystem;
+using MUnique.OpenMU.DataModel.Attributes;
+using MUnique.OpenMU.DataModel.Configuration;
+using MUnique.OpenMU.GameLogic.Attributes;
+
+///
+/// Initializer for the reflection buff effect.
+///
+public class ReflectionEffectInitializer : InitializerBase
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The context.
+ /// The game configuration.
+ public ReflectionEffectInitializer(IContext context, GameConfiguration gameConfiguration)
+ : base(context, gameConfiguration)
+ {
+ }
+
+ ///
+ public override void Initialize()
+ {
+ var magicEffect = this.Context.CreateNew();
+ this.GameConfiguration.MagicEffects.Add(magicEffect);
+ magicEffect.Number = (byte)MagicEffectNumber.Reflection;
+ magicEffect.Name = "Reflection";
+ magicEffect.InformObservers = true;
+ magicEffect.SendDuration = false;
+ magicEffect.StopByDeath = true;
+ var powerUpDefinition = this.Context.CreateNew();
+ magicEffect.PowerUpDefinitions.Add(powerUpDefinition);
+ powerUpDefinition.TargetAttribute = Stats.DamageReflection.GetPersistent(this.GameConfiguration);
+ magicEffect.Duration = this.Context.CreateNew();
+ magicEffect.Duration.ConstantValue.Value = 30;
+ var durationPerEnergy = this.Context.CreateNew();
+ durationPerEnergy.InputAttribute = Stats.TotalEnergy.GetPersistent(this.GameConfiguration);
+ durationPerEnergy.InputOperator = InputOperator.Multiply;
+ durationPerEnergy.InputOperand = 1f / 25f; // 25 energy adds 1 second duration
+ magicEffect.Duration.RelatedValues.Add(durationPerEnergy);
+
+ // one percent per 42 energy
+ var boostPerEnergy = this.Context.CreateNew();
+ boostPerEnergy.InputAttribute = Stats.TotalEnergy.GetPersistent(this.GameConfiguration);
+ boostPerEnergy.InputOperator = InputOperator.Multiply;
+ boostPerEnergy.InputOperand = 0.01f / 42f;
+
+ // Reflection % = 30 + (Energi / 42)
+ powerUpDefinition.Boost = this.Context.CreateNew();
+ powerUpDefinition.Boost.ConstantValue.Value = 0.29f;
+ powerUpDefinition.Boost.ConstantValue.AggregateType = AggregateType.AddRaw;
+ powerUpDefinition.Boost.RelatedValues.Add(boostPerEnergy);
+ }
+}
\ No newline at end of file
diff --git a/src/Persistence/Initialization/VersionSeasonSix/SkillsInitializer.cs b/src/Persistence/Initialization/VersionSeasonSix/SkillsInitializer.cs
index 142cc96a9..28b59414f 100644
--- a/src/Persistence/Initialization/VersionSeasonSix/SkillsInitializer.cs
+++ b/src/Persistence/Initialization/VersionSeasonSix/SkillsInitializer.cs
@@ -66,6 +66,7 @@ internal class SkillsInitializer : SkillsInitializerBase
{ SkillNumber.IncreaseHealth, MagicEffectNumber.IncreaseHealth },
{ SkillNumber.IncreaseBlock, MagicEffectNumber.IncreaseBlock },
{ SkillNumber.ExpansionofWizardry, MagicEffectNumber.WizEnhance },
+ { SkillNumber.DamageReflection, MagicEffectNumber.Reflection },
};
private readonly IDictionary _masterSkillRoots;
@@ -173,7 +174,7 @@ public override void Initialize()
this.CreateSkill(SkillNumber.ShieldBurn, "Shield-Burn", CharacterClasses.All, distance: 3, manaConsumption: 30, elementalModifier: ElementalType.Ice, cooldownMinutes: 5);
this.CreateSkill(SkillNumber.DrainLife, "Drain Life", CharacterClasses.AllSummoners, DamageType.Curse, 35, 6, manaConsumption: 50, energyRequirement: 150, skillType: SkillType.AreaSkillExplicitTarget);
this.CreateSkill(SkillNumber.ChainLightning, "Chain Lightning", CharacterClasses.AllSummoners, DamageType.Curse, 70, 6, manaConsumption: 85, energyRequirement: 245, skillType: SkillType.AreaSkillExplicitTarget, skillTarget: SkillTarget.Explicit);
- this.CreateSkill(SkillNumber.DamageReflection, "Damage Reflection", CharacterClasses.AllSummoners, distance: 5, abilityConsumption: 10, manaConsumption: 40, energyRequirement: 375);
+ this.CreateSkill(SkillNumber.DamageReflection, "Damage Reflection", CharacterClasses.AllSummoners, distance: 5, abilityConsumption: 10, manaConsumption: 40, energyRequirement: 375, skillType: SkillType.Buff, implicitTargetRange: 0, targetRestriction: SkillTargetRestriction.Self);
this.CreateSkill(SkillNumber.Berserker, "Berserker", CharacterClasses.AllSummoners, DamageType.Curse, distance: 5, abilityConsumption: 50, manaConsumption: 100, energyRequirement: 620);
this.CreateSkill(SkillNumber.Sleep, "Sleep", CharacterClasses.AllSummoners, distance: 6, abilityConsumption: 3, manaConsumption: 20, energyRequirement: 180);
this.CreateSkill(SkillNumber.Weakness, "Weakness", CharacterClasses.AllSummoners, distance: 6, abilityConsumption: 15, manaConsumption: 50, energyRequirement: 663);
@@ -572,6 +573,7 @@ private void InitializeEffects()
new IncreaseHealthEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new IncreaseBlockEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new WizardryEnhanceEffectInitializer(this.Context, this.GameConfiguration).Initialize();
+ new ReflectionEffectInitializer(this.Context, this.GameConfiguration).Initialize();
}
private void MapSkillsToEffects()