Files
AdamuSw/src/Persistence/Initialization/Updates/FinishElfMasterTreePlugIn.cs
ze-dom 960664c1c3 Reverted parenthesis, updated update plugin date
(cherry picked from commit b7df2defd31d3ee5eeca13490fd47956f1c06bb4)
2026-07-27 01:03:46 +03:00

170 lines
8.8 KiB
C#

// <copyright file="FinishElfMasterTreePlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.Persistence.Initialization.Updates;
using System.Runtime.InteropServices;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Attributes;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.Items;
using MUnique.OpenMU.Persistence.Initialization.Skills;
using MUnique.OpenMU.Persistence.Initialization.VersionSeasonSix;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// This update completes the elf master tree and fixes some of its skill values. It also adds the missing extra projectile (4th) on some higher level (cross)bows.
/// </summary>
[PlugIn]
[Display(Name = PlugInName, Description = PlugInDescription)]
[Guid("D1E2F3A4-B5C6-7D8E-9F0A-1B2C3D4E5F6A")]
public class FinishElfMasterTreePlugIn : UpdatePlugInBase
{
/// <summary>
/// The plug in name.
/// </summary>
internal const string PlugInName = "Finish Elf Master Tree PlugIn";
/// <summary>
/// The plug in description.
/// </summary>
internal const string PlugInDescription = "This update completes the elf master tree and fixes some of its skill values. It also adds the missing extra projectile (4th) on some higher level (cross)bows.";
/// <inheritdoc />
public override UpdateVersion Version => UpdateVersion.FinishElfMasterTree;
/// <inheritdoc />
public override string DataInitializationKey => DataInitialization.Id;
/// <inheritdoc />
public override string Name => PlugInName;
/// <inheritdoc />
public override string Description => PlugInDescription;
/// <inheritdoc />
public override bool IsMandatory => true;
/// <inheritdoc />
public override DateTime CreatedAt => new(2026, 7, 22, 16, 0, 0, DateTimeKind.Utc);
/// <inheritdoc />
protected override async ValueTask ApplyAsync(IContext context, GameConfiguration gameConfiguration)
{
// Create new Stats
var extraProjectiles = context.CreateNew<AttributeDefinition>(Stats.ExtraProjectiles.Id, Stats.ExtraProjectiles.Designation, Stats.ExtraProjectiles.Description);
gameConfiguration.Attributes.Add(extraProjectiles);
var greaterDefenseBonus = context.CreateNew<AttributeDefinition>(Stats.GreaterDefenseBonus.Id, Stats.GreaterDefenseBonus.Designation, Stats.GreaterDefenseBonus.Description);
gameConfiguration.Attributes.Add(greaterDefenseBonus);
var greaterDamageBonus = Stats.GreaterDamageBonus.GetPersistent(gameConfiguration);
// Update Greater Damage effect
var greaterDamageEffect = gameConfiguration.MagicEffects.First(e => e.Number == (short)MagicEffectNumber.GreaterDamage);
var greaterDamagePowerUp2 = context.CreateNew<PowerUpDefinition>();
greaterDamageEffect.PowerUpDefinitions.Add(greaterDamagePowerUp2);
greaterDamagePowerUp2.TargetAttribute = greaterDamageBonus;
greaterDamagePowerUp2.Boost = context.CreateNew<PowerUpDefinitionValue>();
greaterDamagePowerUp2.Boost.ConstantValue.Value = 1f;
greaterDamagePowerUp2.Boost.ConstantValue.AggregateType = AggregateType.Multiplicate;
// Update Greater Defense effect
var greaterDefenseEffect = gameConfiguration.MagicEffects.First(e => e.Number == (short)MagicEffectNumber.GreaterDefense);
if (greaterDefenseEffect.PowerUpDefinitions.FirstOrDefault() is PowerUpDefinition defensePowerUp)
{
defensePowerUp.TargetAttribute = greaterDefenseBonus;
defensePowerUp.Boost?.ConstantValue.AggregateType = AggregateType.AddRaw;
}
var greaterDefensePowerUp2 = context.CreateNew<PowerUpDefinition>();
greaterDefenseEffect.PowerUpDefinitions.Add(greaterDefensePowerUp2);
greaterDefensePowerUp2.TargetAttribute = greaterDefenseBonus;
greaterDefensePowerUp2.Boost = context.CreateNew<PowerUpDefinitionValue>();
greaterDefensePowerUp2.Boost.ConstantValue.Value = 1f;
greaterDefensePowerUp2.Boost.ConstantValue.AggregateType = AggregateType.Multiplicate;
// Update Infinity Arrow effect
var infinityArrowEffect = gameConfiguration.MagicEffects.First(e => e.Number == (short)MagicEffectNumber.InfiniteArrow);
if (infinityArrowEffect.PowerUpDefinitions.FirstOrDefault(pud => pud.TargetAttribute == Stats.AttackDamageIncrease) is PowerUpDefinition infinityArrowPowerUp)
{
infinityArrowPowerUp.Boost?.ConstantValue.Value = 1;
infinityArrowPowerUp.Boost?.ConstantValue.AggregateType = AggregateType.Multiplicate;
}
// Update 4-arrow (cross)bows
var affectedBows = new short[] { 18, 19, 22, 23, 24 };
var bows = gameConfiguration.Items.Where(i => i.Group == (byte)ItemGroups.Bows && affectedBows.Contains(i.Number));
foreach (var bow in bows)
{
bow.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(context, gameConfiguration, extraProjectiles, 1, AggregateType.AddRaw));
}
// Update master skills
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.DefenseIncreaseStr)?.MasterDefinition is { } defenseIncreaseStr)
{
defenseIncreaseStr.ValueFormula = $"{SkillsInitializer.Formula502} / 100";
defenseIncreaseStr.TargetAttribute = greaterDefenseBonus;
defenseIncreaseStr.Aggregation = AggregateType.Multiplicate;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.TripleShotMastery)?.MasterDefinition is { } tripleShotMastery)
{
tripleShotMastery.ReplacedSkill = gameConfiguration.Skills.First(s => s.Number == (short)SkillNumber.TripleShotStrengthener);
tripleShotMastery.TargetAttribute = extraProjectiles;
tripleShotMastery.Aggregation = AggregateType.AddRaw;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.SummonedMonsterStr2)?.MasterDefinition is { } summonedMonsterStr2)
{
summonedMonsterStr2.ValueFormula = SkillsInitializer.Formula6020Value;
summonedMonsterStr2.Root = gameConfiguration.MasterSkillRoots.First(s => s.Name == "Middle Root");
summonedMonsterStr2.Rank = 3;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.AttackIncreaseStr)?.MasterDefinition is { } attackIncreaseStr)
{
attackIncreaseStr.ValueFormula = $"{SkillsInitializer.Formula502} / 100";
attackIncreaseStr.TargetAttribute = greaterDamageBonus;
attackIncreaseStr.Aggregation = AggregateType.Multiplicate;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.AttackIncreaseMastery)?.MasterDefinition is { } attackIncreaseMastery)
{
attackIncreaseMastery.ReplacedSkill = gameConfiguration.Skills.First(s => s.Number == (short)SkillNumber.AttackIncreaseStr);
attackIncreaseMastery.ValueFormula = $"{SkillsInitializer.Formula502} / 100";
attackIncreaseMastery.TargetAttribute = greaterDamageBonus;
attackIncreaseMastery.Aggregation = AggregateType.Multiplicate;
attackIncreaseMastery.ExtendsDuration = true;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.DefenseIncreaseMastery)?.MasterDefinition is { } defenseIncreaseMastery)
{
defenseIncreaseMastery.ReplacedSkill = gameConfiguration.Skills.First(s => s.Number == (short)SkillNumber.DefenseIncreaseStr);
defenseIncreaseMastery.ValueFormula = $"{SkillsInitializer.Formula502} / 100";
defenseIncreaseMastery.TargetAttribute = greaterDefenseBonus;
defenseIncreaseMastery.Aggregation = AggregateType.Multiplicate;
defenseIncreaseMastery.ExtendsDuration = true;
}
if (gameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.InfinityArrowStr)?.MasterDefinition is { } infinityArrowStr)
{
infinityArrowStr.ValueFormula = $"{SkillsInitializer.Formula120} / 100";
}
}
private ItemBasePowerUpDefinition CreateItemBasePowerUpDefinition(IContext context, GameConfiguration gameConfiguration, AttributeDefinition attributeDefinition, float value, AggregateType aggregateType)
{
var powerUpDefinition = context.CreateNew<ItemBasePowerUpDefinition>();
powerUpDefinition.TargetAttribute = attributeDefinition.GetPersistent(gameConfiguration);
powerUpDefinition.BaseValue = value;
powerUpDefinition.AggregateType = aggregateType;
return powerUpDefinition;
}
}