//
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
namespace MUnique.OpenMU.Persistence.Initialization.Updates;
using System.Runtime.InteropServices;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.PlugIns;
///
/// Updates some item requirements for elf bows that were initialized wrongly.
///
[PlugIn]
[Display(Name = PlugInName, Description = PlugInDescription)]
[Guid("9E8DB2CB-1972-40D3-9129-6964ABFEB4DC")]
public class FixItemRequirementsPlugIn : UpdatePlugInBase
{
///
/// The plugin name.
///
internal const string PlugInName = "Fix Item Requirements (Elf Bows)";
///
/// The plugin description.
///
internal const string PlugInDescription = "Updates some item requirements for elf bows which were initialized wrongly.";
private static readonly List<(int Group, int Number, int StrengthRequirement, int AgilityRequirement, int EnergyRequirement, int VitalityRequirement)> RequirementCorrections =
[
(4, 0, 20, 80, 0, 0), // Short Bow
(4, 1, 30, 90, 0, 0), // Bow
(4, 2, 30, 90, 0, 0), // Elven Bow
(4, 3, 30, 90, 0, 0), // Battle Bow
(4, 4, 30, 100, 0, 0), // Tiger Bow
(4, 5, 30, 100, 0, 0), // Silver Bow
(4, 6, 40, 150, 0, 0), // Chaos Nature Bow
/*
These are handled different, so they don't need to be corrected.
See ItemExtensions.GetRequirement.
(15, 0, 0, 0, 100, 0), // Scroll of Poison
(15, 1, 0, 0, 100, 0), // Scroll of Meteorite
(15, 2, 0, 0, 100, 0), // Scroll of Lighting
(15, 3, 0, 0, 100, 0), // Scroll of Fire Ball
(15, 4, 0, 0, 100, 0), // Scroll of Flame
(15, 5, 0, 0, 100, 0), // Scroll of Teleport
(15, 6, 0, 0, 100, 0), // Scroll of Ice
(15, 7, 0, 0, 100, 0), // Scroll of Twister
(15, 8, 0, 0, 100, 0), // Scroll of Evil Spirit
(15, 9, 0, 0, 100, 0), // Scroll of Hellfire
(15, 10, 0, 0, 100, 0), // Scroll of Power Wave
(15, 11, 0, 0, 110, 0), // Scroll of Aqua Beam
(15, 12, 0, 0, 150, 0), // Scroll of Cometfall
(15, 13, 0, 0, 200, 0), // Scroll of Inferno
(15, 14, 0, 0, 188, 0), // Scroll of Teleport Ally
(15, 15, 0, 0, 126, 0), // Scroll of Soul Barrier
(15, 16, 0, 0, 243, 0), // Scroll of Decay
(15, 17, 0, 0, 223, 0), // Scroll of Ice Storm
(15, 18, 0, 0, 258, 0), // Scroll of Nova
(15, 19, 0, 0, 75, 0), // Chain Lightning Parchment
(15, 20, 0, 0, 93, 0), // Drain Life Parchment
(15, 21, 0, 0, 216, 0), // Lightning Shock Parchment
(15, 22, 0, 0, 111, 0), // Damage Reflection Parchment
(15, 23, 0, 0, 181, 0), // Berserker Parchment
(15, 24, 0, 0, 100, 0), // Sleep Parchment
(15, 26, 0, 0, 173, 0), // Weakness Parchment
(15, 27, 0, 0, 201, 0), // Innovation Parchment
(15, 28, 0, 0, 118, 0), // Scroll of Wizardry Enhance
(15, 29, 0, 0, 118, 0), // Scroll of Gigantic Storm
(15, 34, 0, 0, ?, 0), // Ignore Defense Parchment
(15, 35, 0, 0, ?, 0), // Increase Health Parchment
(15, 36, 0, 0, ?, 0), // Increase Block Parchment
*/
];
///
public override UpdateVersion Version => UpdateVersion.FixItemRequirements;
///
public override string DataInitializationKey => VersionSeasonSix.DataInitialization.Id;
///
public override string Name => PlugInName;
///
public override string Description => PlugInDescription;
///
public override bool IsMandatory => true;
///
public override DateTime CreatedAt => new(2024, 11, 03, 18, 0, 0, DateTimeKind.Utc);
///
protected override async ValueTask ApplyAsync(IContext context, GameConfiguration gameConfiguration)
{
foreach (var reqUpdate in RequirementCorrections)
{
var item = gameConfiguration.Items.First(x => x.Number == reqUpdate.Number && x.Group == reqUpdate.Group);
UpdateRequirement(Stats.TotalStrengthRequirementValue, reqUpdate.StrengthRequirement);
UpdateRequirement(Stats.TotalAgilityRequirementValue, reqUpdate.AgilityRequirement);
UpdateRequirement(Stats.TotalEnergyRequirementValue, reqUpdate.EnergyRequirement);
UpdateRequirement(Stats.TotalVitalityRequirementValue, reqUpdate.VitalityRequirement);
void UpdateRequirement(AttributeDefinition stat, int newValue)
{
var requirement = item.Requirements.FirstOrDefault(r => r.Attribute == stat);
if (requirement is null && newValue == 0)
{
return;
}
if (requirement is null)
{
requirement = context.CreateNew();
requirement.Attribute = stat.GetPersistent(gameConfiguration);
item.Requirements.Add(requirement);
}
requirement.MinimumValue = newValue;
}
}
}
}