baseline: OpenMU upstream b5a0961 (fresh source)

This commit is contained in:
Acentech Dev
2026-07-14 19:00:35 +03:00
parent 450402e47d
commit 36fc125d5c
11968 changed files with 748705 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
// <copyright file="ChaosMixes.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.Version075;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.ItemCrafting;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.PlayerActions.Craftings;
using MUnique.OpenMU.Persistence.Initialization.Version075.Items;
/// <summary>
/// Initializer for chaos mixes.
/// </summary>
public class ChaosMixes : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="ChaosMixes"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public ChaosMixes(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
public override void Initialize()
{
var chaosGoblin = this.GameConfiguration.Monsters.First(m => m.NpcWindow == NpcWindow.ChaosMachine);
chaosGoblin.ItemCraftings.Add(this.ChaosWeaponCrafting());
}
private ItemCrafting ChaosWeaponCrafting()
{
var chaosWeapon = this.Context.CreateNew<ItemCrafting>();
chaosWeapon.Name = "Chaos Weapon";
chaosWeapon.Number = 1;
chaosWeapon.ItemCraftingHandlerClassName = typeof(ChaosWeaponAndFirstWingsCrafting).FullName!;
var chaosWeaponSettings = this.Context.CreateNew<SimpleCraftingSettings>();
chaosWeapon.SimpleCraftingSettings = chaosWeaponSettings;
chaosWeaponSettings.MoneyPerFinalSuccessPercentage = 10_000;
chaosWeaponSettings.NpcPriceDivisor = 20_000;
// Requirements:
var randomItem = this.Context.CreateNew<ItemCraftingRequiredItem>();
randomItem.MinimumAmount = 1;
randomItem.MinimumItemLevel = 4;
randomItem.MaximumItemLevel = Constants.MaximumItemLevel;
randomItem.FailResult = MixResult.ChaosWeaponAndFirstWingsDowngradedRandom;
randomItem.RequiredItemOptions.Add(this.GameConfiguration.ItemOptionTypes.First(o => o == ItemOptionTypes.Option));
randomItem.SuccessResult = MixResult.Disappear;
chaosWeaponSettings.RequiredItems.Add(randomItem);
var chaos = this.Context.CreateNew<ItemCraftingRequiredItem>();
chaos.MinimumAmount = 1;
chaos.SuccessResult = MixResult.Disappear;
chaos.FailResult = MixResult.Disappear;
chaos.PossibleItems.Add(this.GameConfiguration.Items.First(i => i.Name == "Jewel of Chaos"));
chaosWeaponSettings.RequiredItems.Add(chaos);
var bless = this.Context.CreateNew<ItemCraftingRequiredItem>();
bless.MinimumAmount = 0;
bless.SuccessResult = MixResult.Disappear;
bless.FailResult = MixResult.Disappear;
bless.PossibleItems.Add(this.GameConfiguration.Items.First(i => i.Name == "Jewel of Bless"));
chaosWeaponSettings.RequiredItems.Add(bless);
var soul = this.Context.CreateNew<ItemCraftingRequiredItem>();
soul.MinimumAmount = 0;
soul.SuccessResult = MixResult.Disappear;
soul.FailResult = MixResult.Disappear;
soul.PossibleItems.Add(this.GameConfiguration.Items.First(i => i.Name == "Jewel of Soul"));
chaosWeaponSettings.RequiredItems.Add(soul);
// Result:
chaosWeaponSettings.ResultItemSelect = ResultItemSelection.Any;
var chaosDragonAxe = this.Context.CreateNew<ItemCraftingResultItem>();
chaosDragonAxe.ItemDefinition = this.GameConfiguration.Items.First(i => i.Name == "Chaos Dragon Axe");
chaosDragonAxe.RandomMinimumLevel = 0;
chaosDragonAxe.RandomMaximumLevel = 4;
chaosWeaponSettings.ResultItems.Add(chaosDragonAxe);
var chaosNatureBow = this.Context.CreateNew<ItemCraftingResultItem>();
chaosNatureBow.ItemDefinition = this.GameConfiguration.Items.First(i => i.Name == "Chaos Nature Bow");
chaosNatureBow.RandomMinimumLevel = 0;
chaosNatureBow.RandomMaximumLevel = 4;
chaosWeaponSettings.ResultItems.Add(chaosNatureBow);
var chaosLightningStaff = this.Context.CreateNew<ItemCraftingResultItem>();
chaosLightningStaff.ItemDefinition = this.GameConfiguration.Items.First(i => i.Name == "Chaos Lightning Staff");
chaosLightningStaff.RandomMinimumLevel = 0;
chaosLightningStaff.RandomMaximumLevel = 4;
chaosWeaponSettings.ResultItems.Add(chaosLightningStaff);
return chaosWeapon;
}
}

View File

@@ -0,0 +1,35 @@
// <copyright file="CharacterClassInitialization.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.Version075;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
/// <summary>
/// Initialization of character classes data for Version 0.75.
/// </summary>
internal class CharacterClassInitialization : Initialization.CharacterClasses.CharacterClassInitialization
{
/// <summary>
/// Initializes a new instance of the <see cref="CharacterClassInitialization"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public CharacterClassInitialization(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
protected override bool UseClassicPvp => true;
/// <inheritdoc />
public override void Initialize()
{
this.CreateDarkKnight(CharacterClassNumber.DarkKnight, "Dark Knight", false, null, true);
this.CreateDarkWizard(CharacterClassNumber.DarkWizard, "Dark Wizard", false, null, true);
this.CreateFairyElf(CharacterClassNumber.FairyElf, "Fairy Elf", false, null, true);
}
}

View File

@@ -0,0 +1,64 @@
// <copyright file="DataInitialization.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.Version075;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Logging;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.Network.PlugIns;
using MUnique.OpenMU.Persistence.Initialization.Version075.TestAccounts;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// Data initialization plugin for Version 0.75.
/// </summary>
[Guid("420F8E50-0ACB-4A90-AF86-E1035D97F84D")]
[PlugIn]
[Display(Name = nameof(PlugInResources.DataInitialization075_Name), Description = nameof(PlugInResources.DataInitialization075_Description), ResourceType = typeof(PlugInResources))]
public class DataInitialization : DataInitializationBase
{
/// <summary>
/// Initializes a new instance of the <see cref="DataInitialization" /> class.
/// </summary>
/// <param name="persistenceContextProvider">The persistence context provider.</param>
/// <param name="loggerFactory">The logger factory.</param>
public DataInitialization(IPersistenceContextProvider persistenceContextProvider, ILoggerFactory loggerFactory)
: base(persistenceContextProvider, loggerFactory)
{
}
/// <summary>
/// Gets the identifier, by which the initialization is selected.
/// </summary>
public static string Id => "0.75";
/// <inheritdoc />
public override string Key => Id;
/// <inheritdoc />
public override string Caption => "0.75";
/// <inheritdoc />
protected override IInitializer GameConfigurationInitializer => new GameConfigurationInitializer(this.Context, this.GameConfiguration);
/// <inheritdoc />
protected override IGameMapsInitializer GameMapsInitializer => new GameMapsInitializer(this.Context, this.GameConfiguration);
/// <inheritdoc />
protected override IInitializer? TestAccountsInitializer => new TestAccountsInitialization(this.Context, this.GameConfiguration);
/// <inheritdoc />
protected override void CreateGameClientDefinition()
{
var version075Definition = this.Context.CreateNew<GameClientDefinition>();
version075Definition.SetGuid(75);
version075Definition.Season = 0;
version075Definition.Episode = 75;
version075Definition.Language = ClientLanguage.Invariant; // it doesn't fit into any available category - maybe it's so old that it didn't have differences in the protocol yet.
version075Definition.Version = new byte[] { 0x30, 0x37, 0x35, 0x30, 0x30 }; // the last two bytes are not relevant as te 0.75 does only use the first 3 bytes.
version075Definition.Serial = Encoding.ASCII.GetBytes("sudv(*40ds7lkN2n");
version075Definition.Description = "Version 0.75 Client";
}
}

View File

@@ -0,0 +1,63 @@
// <copyright file="GameConfigurationInitializer.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.Version075;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.Persistence.Initialization.Version075.Items;
/// <summary>
/// Initializes the <see cref="GameConfiguration"/>.
/// </summary>
public class GameConfigurationInitializer : GameConfigurationInitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="GameConfigurationInitializer"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public GameConfigurationInitializer(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
protected override IEnumerable<ItemOptionType> OptionTypes
{
get
{
yield return ItemOptionTypes.Option;
yield return ItemOptionTypes.Luck;
}
}
/// <inheritdoc />
public override void Initialize()
{
base.Initialize();
new CharacterClassInitialization(this.Context, this.GameConfiguration).Initialize();
new SkillsInitializer(this.Context, this.GameConfiguration).Initialize();
new Orbs(this.Context, this.GameConfiguration).Initialize();
new Scrolls(this.Context, this.GameConfiguration).Initialize();
new Jewels(this.Context, this.GameConfiguration).Initialize();
new Armors(this.Context, this.GameConfiguration).Initialize();
new Wings(this.Context, this.GameConfiguration).Initialize();
new Pets(this.Context, this.GameConfiguration).Initialize();
new Weapons(this.Context, this.GameConfiguration).Initialize();
new Potions(this.Context, this.GameConfiguration).Initialize();
new Jewelery(this.Context, this.GameConfiguration).Initialize();
new NpcInitialization(this.Context, this.GameConfiguration).Initialize();
new GameMapsInitializer(this.Context, this.GameConfiguration).Initialize();
this.AssignCharacterClassHomeMaps();
new ChaosMixes(this.Context, this.GameConfiguration).Initialize(); // todo
new Gates(this.Context, this.GameConfiguration).Initialize();
//// TODO: ItemSetGroups for set bonus
}
}

View File

@@ -0,0 +1,40 @@
// <copyright file="GameMapsInitializer.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.Version075;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.Persistence.Initialization.Version075.Maps;
/// <summary>
/// Initializes the <see cref="GameMapDefinition"/>s.
/// </summary>
public class GameMapsInitializer : GameMapsInitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="GameMapsInitializer"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public GameMapsInitializer(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
protected override IEnumerable<Type> MapInitializerTypes
{
get
{
yield return typeof(Lorencia);
yield return typeof(Dungeon);
yield return typeof(Devias);
yield return typeof(Noria);
yield return typeof(LostTower);
yield return typeof(Exile);
yield return typeof(Arena);
yield return typeof(Atlans);
}
}
}

View File

@@ -0,0 +1,208 @@
// <copyright file="Gates.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.Version075;
using MUnique.OpenMU.DataModel.Configuration;
/// <summary>
/// Gates initialization.
/// </summary>
public class Gates : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Gates" /> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Gates(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Initializes the gates.
/// </summary>
public override void Initialize()
{
var maps = this.GameConfiguration.Maps.ToDictionary(map => map.Number, map => map);
var targetGates = this.CreateTargetGates(maps);
this.CreateEnterGates(maps, targetGates);
this.CreateWarpEntries(targetGates);
}
/// <summary>
/// Creates the warp entries.
/// </summary>
/// <param name="gates">The gates.</param>
/// <remarks>
/// Version 0.75 has no graphical menu, but allows to warp with text commands.
/// </remarks>
private void CreateWarpEntries(IDictionary<short, ExitGate> gates)
{
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(1, "Arena", 2000, 50, gates[50]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(2, "Lorencia", 2000, 10, gates[17]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(3, "Noria", 2000, 10, gates[27]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(4, "Devias", 2000, 20, gates[22]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(5, "Dungeon", 3000, 30, gates[2]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(6, "Dungeon2", 3500, 40, gates[6]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(7, "Dungeon3", 4000, 50, gates[10]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(8, "LostTower", 5000, 50, gates[42]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(9, "LostTower2", 5500, 50, gates[31]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(10, "LostTower3", 6000, 50, gates[33]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(11, "LostTower4", 6500, 60, gates[35]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(12, "LostTower5", 7000, 60, gates[37]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(13, "LostTower6", 7500, 70, gates[39]));
this.GameConfiguration.WarpList.Add(this.CreateWarpInfo(14, "LostTower7", 8000, 70, gates[41]));
}
private WarpInfo CreateWarpInfo(ushort index, string name, int costs, int levelRequirement, ExitGate gate)
{
var warpInfo = this.Context.CreateNew<WarpInfo>();
warpInfo.Index = index;
warpInfo.Name = name;
warpInfo.Costs = costs;
warpInfo.LevelRequirement = levelRequirement;
warpInfo.Gate = gate;
return warpInfo;
}
private ExitGate CreateExitGate(GameMapDefinition map, byte x1, byte y1, byte x2, byte y2, byte direction, bool isSpawnGate = false)
{
if (x1 > x2)
{
throw new ArgumentException("x1 > x2");
}
if (y1 > y2)
{
throw new ArgumentException("y1 > y2");
}
var gate = this.Context.CreateNew<ExitGate>();
gate.Map = map;
gate.X1 = x1;
gate.Y1 = y1;
gate.X2 = x2;
gate.Y2 = y2;
// different to all other configurations, 0 means 'Undefined', so we just assume that we can cast it to Direction without adding 1.
gate.Direction = (Direction)direction;
gate.IsSpawnGate = isSpawnGate;
map.ExitGates.Add(gate);
return gate;
}
/// <summary>
/// Creates the target gates and adds them to the <see cref="GameMapDefinition.ExitGates" /> if the gate is specified as spawn gate (flag == 0).
/// </summary>
/// <param name="maps">The previously created game maps.</param>
/// <returns>A dictionary of all created exit gates. The key is the number.</returns>
/// <remarks>
/// Regex #1: (?m)^(\d+)\s+?(0)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+).*?$
/// Rplace by #1: targetGates.Add($1, this.CreateExitGate(maps[$3], $4, $5, $6, $7, $9, true));
/// Regex #2: (?m)^(\d+)\s+?(2)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+).*?$
/// Rplace by #2: targetGates.Add($1, this.CreateExitGate(maps[$3], $4, $5, $6, $7, $9, false));.
/// </remarks>
private IDictionary<short, ExitGate> CreateTargetGates(IDictionary<short, GameMapDefinition> maps)
{
var targetGates = new Dictionary<short, ExitGate>();
// Lorencia
targetGates.Add(17, this.CreateExitGate(maps[0], 133, 118, 151, 135, 0, true));
targetGates.Add(4, this.CreateExitGate(maps[0], 121, 231, 123, 231, 1));
targetGates.Add(21, this.CreateExitGate(maps[0], 7, 38, 8, 41, 3));
targetGates.Add(26, this.CreateExitGate(maps[0], 213, 244, 217, 245, 1));
// Dungeon
targetGates.Add(2, this.CreateExitGate(maps[1], 107, 247, 110, 247, 1));
targetGates.Add(6, this.CreateExitGate(maps[1], 231, 126, 234, 127, 1));
targetGates.Add(8, this.CreateExitGate(maps[1], 240, 149, 241, 151, 3));
targetGates.Add(10, this.CreateExitGate(maps[1], 3, 83, 4, 86, 3));
targetGates.Add(12, this.CreateExitGate(maps[1], 3, 16, 6, 17, 3));
targetGates.Add(14, this.CreateExitGate(maps[1], 29, 125, 30, 126, 1));
targetGates.Add(16, this.CreateExitGate(maps[1], 5, 32, 7, 33, 1));
// Devias
targetGates.Add(22, this.CreateExitGate(maps[2], 197, 35, 218, 50, 0, true));
targetGates.Add(19, this.CreateExitGate(maps[2], 242, 34, 243, 37, 7));
targetGates.Add(44, this.CreateExitGate(maps[2], 2, 246, 3, 247, 2));
// Noria
targetGates.Add(27, this.CreateExitGate(maps[3], 171, 108, 177, 117, 0, true));
targetGates.Add(24, this.CreateExitGate(maps[3], 148, 5, 155, 6, 5));
targetGates.Add(48, this.CreateExitGate(maps[3], 240, 240, 241, 243, 7));
// Lost Tower
targetGates.Add(42, this.CreateExitGate(maps[4], 203, 70, 213, 81, 0, true));
targetGates.Add(29, this.CreateExitGate(maps[4], 162, 2, 166, 3, 5));
targetGates.Add(31, this.CreateExitGate(maps[4], 241, 237, 244, 238, 1));
targetGates.Add(33, this.CreateExitGate(maps[4], 86, 166, 87, 168, 3));
targetGates.Add(35, this.CreateExitGate(maps[4], 87, 86, 88, 89, 3));
targetGates.Add(37, this.CreateExitGate(maps[4], 128, 53, 131, 54, 1));
targetGates.Add(39, this.CreateExitGate(maps[4], 52, 53, 55, 54, 1));
targetGates.Add(41, this.CreateExitGate(maps[4], 8, 85, 9, 87, 1));
// Atlans
targetGates.Add(49, this.CreateExitGate(maps[7], 15, 11, 27, 23, 0, true));
targetGates.Add(46, this.CreateExitGate(maps[7], 14, 12, 15, 13, 3));
// Arena
targetGates.Add(50, this.CreateExitGate(maps[6], 101, 115, 103, 117, 0, true));
targetGates.Add(51, this.CreateExitGate(maps[6], 107, 115, 107, 115, 0, true));
targetGates.Add(52, this.CreateExitGate(maps[6], 107, 114, 107, 114, 0, true));
return targetGates;
}
private EnterGate CreateEnterGate(short number, ExitGate targetGate, byte x1, byte y1, byte x2, byte y2, short levelRequirement)
{
var enterGate = this.Context.CreateNew<EnterGate>();
enterGate.Number = number;
enterGate.LevelRequirement = levelRequirement;
enterGate.TargetGate = targetGate;
enterGate.X1 = x1;
enterGate.Y1 = y1;
enterGate.X2 = x2;
enterGate.Y2 = y2;
enterGate.LevelRequirement = levelRequirement;
return enterGate;
}
/// <summary>
/// Creates the enter gates for all maps.
/// </summary>
/// <remarks>
/// Regex: (?m)^(\d+)\s+?(1)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)\s+?(\d+)
/// Replace by #2: maps[$3].EnterGates.Add(this.CreateEnterGate($1, targetGates[$8], $4, $5, $6, $7, $10));
/// Remove other lines with empty replacement and regex: (?m)^\d+\s+.*$.
/// </remarks>
/// <param name="maps">The maps.</param>
/// <param name="targetGates">The target gates by number.</param>
private void CreateEnterGates(IDictionary<short, GameMapDefinition> maps, IDictionary<short, ExitGate> targetGates)
{
maps[0].EnterGates.Add(this.CreateEnterGate(1, targetGates[2], 121, 232, 123, 233, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(3, targetGates[4], 108, 248, 109, 248, 0));
maps[1].EnterGates.Add(this.CreateEnterGate(5, targetGates[6], 239, 149, 239, 150, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(7, targetGates[8], 232, 127, 233, 128, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(9, targetGates[10], 2, 17, 2, 18, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(11, targetGates[12], 2, 84, 2, 85, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(13, targetGates[14], 5, 34, 6, 34, 20));
maps[1].EnterGates.Add(this.CreateEnterGate(15, targetGates[16], 29, 127, 30, 127, 20));
maps[0].EnterGates.Add(this.CreateEnterGate(18, targetGates[19], 5, 38, 6, 41, 15));
maps[2].EnterGates.Add(this.CreateEnterGate(20, targetGates[21], 244, 34, 245, 37, 0));
maps[0].EnterGates.Add(this.CreateEnterGate(23, targetGates[24], 213, 246, 217, 247, 10));
maps[3].EnterGates.Add(this.CreateEnterGate(25, targetGates[26], 148, 3, 155, 4, 10));
maps[2].EnterGates.Add(this.CreateEnterGate(28, targetGates[29], 2, 248, 3, 249, 40));
maps[4].EnterGates.Add(this.CreateEnterGate(30, targetGates[31], 190, 6, 191, 8, 40));
maps[4].EnterGates.Add(this.CreateEnterGate(32, targetGates[33], 166, 163, 167, 166, 40));
maps[4].EnterGates.Add(this.CreateEnterGate(34, targetGates[35], 132, 245, 135, 246, 50));
maps[4].EnterGates.Add(this.CreateEnterGate(36, targetGates[37], 132, 135, 135, 136, 50));
maps[4].EnterGates.Add(this.CreateEnterGate(38, targetGates[39], 131, 15, 132, 18, 50));
maps[4].EnterGates.Add(this.CreateEnterGate(40, targetGates[41], 6, 5, 7, 8, 50));
maps[4].EnterGates.Add(this.CreateEnterGate(43, targetGates[44], 162, 0, 166, 1, 15));
maps[3].EnterGates.Add(this.CreateEnterGate(45, targetGates[46], 242, 240, 245, 243, 60));
maps[7].EnterGates.Add(this.CreateEnterGate(47, targetGates[48], 9, 9, 11, 12, 60));
}
}

View File

@@ -0,0 +1,139 @@
// <copyright file="Armors.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.Persistence.Initialization.Items;
/// <summary>
/// Initializer for armor data.
/// </summary>
public class Armors : ArmorInitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Armors"/> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Armors(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
protected override byte MaximumArmorLevel => 11;
/// <summary>
/// Initializes armor data.
/// </summary>
public override void Initialize()
{
base.Initialize();
// Shields:
this.CreateShield(0, 1, 0, 2, 2, "Small Shield", 3, 1, 3, 22, 70, 0, 1, 1, 1);
this.CreateShield(1, 1, 0, 2, 2, "Horn Shield", 9, 3, 9, 28, 100, 0, 0, 1, 0);
this.CreateShield(2, 1, 0, 2, 2, "Kite Shield", 12, 4, 12, 32, 110, 0, 0, 1, 0);
this.CreateShield(3, 1, 0, 2, 2, "Elven Shield", 21, 8, 21, 36, 30, 100, 0, 0, 1);
this.CreateShield(4, 1, 18, 2, 2, "Buckler", 6, 2, 6, 24, 80, 0, 1, 1, 1);
this.CreateShield(5, 1, 18, 2, 2, "Dragon Slayer Shield", 35, 10, 36, 44, 100, 40, 0, 1, 0);
this.CreateShield(6, 1, 18, 2, 2, "Skull Shield", 15, 5, 15, 34, 110, 0, 1, 1, 1);
this.CreateShield(7, 1, 18, 2, 2, "Spiked Shield", 30, 9, 30, 40, 130, 0, 0, 1, 0);
this.CreateShield(8, 1, 18, 2, 2, "Tower Shield", 40, 11, 40, 46, 130, 0, 0, 1, 1);
this.CreateShield(9, 1, 18, 2, 2, "Plate Shield", 25, 8, 25, 38, 120, 0, 0, 1, 0);
this.CreateShield(10, 1, 18, 2, 2, "Big Round Shield", 18, 6, 18, 35, 120, 0, 0, 1, 0);
this.CreateShield(11, 1, 18, 2, 2, "Serpent Shield", 45, 12, 45, 48, 130, 0, 0, 1, 1);
this.CreateShield(12, 1, 18, 2, 2, "Bronze Shield", 54, 13, 54, 52, 140, 0, 0, 1, 0);
this.CreateShield(13, 1, 18, 2, 2, "Dragon Shield", 60, 14, 60, 60, 120, 40, 0, 1, 0);
this.CreateShield(14, 1, 0, 2, 3, "Legendary Shield", 48, 7, 48, 50, 90, 25, 1, 0, 1);
// Helmets:
this.CreateArmor(0, 2, 2, 2, "Bronze Helm", 16, 9, 34, 80, 20, 0, 1, 0);
this.CreateArmor(1, 2, 2, 2, "Dragon Helm", 57, 24, 68, 120, 30, 0, 1, 0);
this.CreateArmor(2, 2, 2, 2, "Pad Helm", 5, 4, 28, 20, 0, 1, 0, 0);
this.CreateArmor(3, 2, 2, 2, "Legendary Helm", 50, 18, 42, 30, 0, 1, 0, 0);
this.CreateArmor(4, 2, 2, 2, "Bone Helm", 18, 9, 30, 30, 0, 1, 0, 0);
this.CreateArmor(5, 2, 2, 2, "Leather Helm", 6, 5, 30, 80, 0, 0, 1, 0);
this.CreateArmor(6, 2, 2, 2, "Scale Helm", 26, 12, 40, 110, 0, 0, 1, 0);
this.CreateArmor(7, 2, 2, 2, "Sphinx Mask", 32, 13, 36, 30, 0, 1, 0, 0);
this.CreateArmor(8, 2, 2, 2, "Brass Helm", 36, 17, 44, 100, 30, 0, 1, 0);
this.CreateArmor(9, 2, 2, 2, "Plate Helm", 46, 20, 50, 130, 0, 0, 1, 0);
this.CreateArmor(10, 2, 2, 2, "Vine Helm", 6, 4, 22, 30, 60, 0, 0, 1);
this.CreateArmor(11, 2, 2, 2, "Silk Helm", 16, 8, 26, 30, 70, 0, 0, 1);
this.CreateArmor(12, 2, 2, 2, "Wind Helm", 28, 12, 32, 30, 80, 0, 0, 1);
this.CreateArmor(13, 2, 2, 2, "Spirit Helm", 40, 16, 38, 40, 80, 0, 0, 1);
this.CreateArmor(14, 2, 2, 2, "Guardian Helm", 53, 23, 45, 40, 80, 0, 0, 1);
// Armors:
this.CreateArmor(0, 3, 2, 2, "Bronze Armor", 18, 14, 34, 80, 20, 0, 1, 0);
this.CreateArmor(1, 3, 2, 3, "Dragon Armor", 59, 37, 68, 120, 30, 0, 1, 0);
this.CreateArmor(2, 3, 2, 2, "Pad Armor", 10, 7, 28, 30, 0, 1, 0, 0);
this.CreateArmor(3, 3, 2, 2, "Legendary Armor", 56, 22, 42, 40, 0, 1, 0, 0);
this.CreateArmor(4, 3, 2, 2, "Bone Armor", 22, 13, 30, 40, 0, 1, 0, 0);
this.CreateArmor(5, 3, 2, 3, "Leather Armor", 10, 10, 30, 80, 0, 0, 1, 0);
this.CreateArmor(6, 3, 2, 2, "Scale Armor", 28, 18, 40, 110, 0, 0, 1, 0);
this.CreateArmor(7, 3, 2, 3, "Sphinx Armor", 38, 17, 36, 40, 0, 1, 0, 0);
this.CreateArmor(8, 3, 2, 2, "Brass Armor", 38, 22, 44, 100, 30, 0, 1, 0);
this.CreateArmor(9, 3, 2, 2, "Plate Armor", 48, 30, 50, 130, 0, 0, 1, 0);
this.CreateArmor(10, 3, 2, 2, "Vine Armor", 10, 8, 22, 30, 60, 0, 0, 1);
this.CreateArmor(11, 3, 2, 2, "Silk Armor", 20, 12, 26, 30, 70, 0, 0, 1);
this.CreateArmor(12, 3, 2, 2, "Wind Armor", 32, 16, 32, 30, 80, 0, 0, 1);
this.CreateArmor(13, 3, 2, 2, "Spirit Armor", 44, 21, 38, 40, 80, 0, 0, 1);
this.CreateArmor(14, 3, 2, 2, "Guardian Armor", 57, 29, 45, 40, 80, 0, 0, 1);
// Pants:
this.CreateArmor(0, 4, 2, 2, "Bronze Pants", 15, 10, 34, 80, 20, 0, 1, 0);
this.CreateArmor(1, 4, 2, 2, "Dragon Pants", 55, 26, 68, 120, 30, 0, 1, 0);
this.CreateArmor(2, 4, 2, 2, "Pad Pants", 8, 5, 28, 30, 0, 1, 0, 0);
this.CreateArmor(3, 4, 2, 2, "Legendary Pants", 53, 20, 42, 40, 0, 1, 0, 0);
this.CreateArmor(4, 4, 2, 2, "Bone Pants", 20, 10, 30, 40, 0, 1, 0, 0);
this.CreateArmor(5, 4, 2, 2, "Leather Pants", 8, 7, 30, 80, 0, 0, 1, 0);
this.CreateArmor(6, 4, 2, 2, "Scale Pants", 25, 14, 40, 110, 0, 0, 1, 0);
this.CreateArmor(7, 4, 2, 2, "Sphinx Pants", 34, 15, 36, 40, 0, 1, 0, 0);
this.CreateArmor(8, 4, 2, 2, "Brass Pants", 35, 18, 44, 100, 30, 0, 1, 0);
this.CreateArmor(9, 4, 2, 2, "Plate Pants", 45, 22, 50, 130, 0, 0, 1, 0);
this.CreateArmor(10, 4, 2, 2, "Vine Pants", 8, 6, 22, 30, 60, 0, 0, 1);
this.CreateArmor(11, 4, 2, 2, "Silk Pants", 18, 10, 26, 30, 70, 0, 0, 1);
this.CreateArmor(12, 4, 2, 2, "Wind Pants", 30, 14, 32, 30, 80, 0, 0, 1);
this.CreateArmor(13, 4, 2, 2, "Spirit Pants", 42, 18, 38, 40, 80, 0, 0, 1);
this.CreateArmor(14, 4, 2, 2, "Guardian Pants", 54, 25, 45, 40, 80, 0, 0, 1);
// Gloves:
this.CreateGloves(0, "Bronze Gloves", 13, 4, 4, 34, 80, 20, 0, 1, 0);
this.CreateGloves(1, "Dragon Gloves", 52, 14, 6, 68, 120, 30, 0, 1, 0);
this.CreateGloves(2, "Pad Gloves", 3, 2, 0, 28, 20, 0, 1, 0, 0);
this.CreateGloves(3, "Legendary Gloves", 44, 11, 0, 42, 20, 0, 1, 0, 0);
this.CreateGloves(4, "Bone Gloves", 14, 5, 0, 30, 20, 0, 1, 0, 0);
this.CreateGloves(5, "Leather Gloves", 4, 2, 8, 30, 80, 0, 0, 1, 0);
this.CreateGloves(6, "Scale Gloves", 22, 7, 10, 40, 110, 0, 0, 1, 0);
this.CreateGloves(7, "Sphinx Gloves", 28, 8, 0, 36, 20, 0, 1, 0, 0);
this.CreateGloves(8, "Brass Gloves", 32, 9, 8, 44, 100, 30, 0, 1, 0);
this.CreateGloves(9, "Plate Gloves", 42, 12, 4, 50, 130, 0, 0, 1, 0);
this.CreateGloves(10, "Vine Gloves", 4, 2, 4, 22, 30, 60, 0, 0, 1);
this.CreateGloves(11, "Silk Gloves", 14, 4, 8, 26, 30, 70, 0, 0, 1);
this.CreateGloves(12, "Wind Gloves", 26, 6, 10, 32, 30, 80, 0, 0, 1);
this.CreateGloves(13, "Spirit Gloves", 38, 9, 4, 38, 40, 80, 0, 0, 1);
this.CreateGloves(14, "Guardian Gloves", 50, 15, 6, 45, 40, 80, 0, 0, 1);
// Boots:
this.CreateBoots(0, 6, 2, 2, "Bronze Boots", 12, 4, 10, 34, 80, 20, 0, 1, 0);
this.CreateBoots(1, 6, 2, 2, "Dragon Boots", 54, 15, 2, 68, 120, 30, 0, 1, 0);
this.CreateBoots(2, 6, 2, 2, "Pad Boots", 4, 3, 10, 28, 20, 0, 1, 0, 0);
this.CreateBoots(3, 6, 2, 2, "Legendary Boots", 46, 12, 0, 42, 30, 0, 1, 0, 0);
this.CreateBoots(4, 6, 2, 2, "Bone Boots", 16, 6, 6, 30, 30, 0, 1, 0, 0);
this.CreateBoots(5, 6, 2, 2, "Leather Boots", 5, 2, 12, 30, 80, 0, 0, 1, 0);
this.CreateBoots(6, 6, 2, 2, "Scale Boots", 22, 8, 8, 40, 110, 0, 0, 1, 0);
this.CreateBoots(7, 6, 2, 2, "Sphinx Boots", 30, 9, 8, 36, 30, 0, 1, 0, 0);
this.CreateBoots(8, 6, 2, 2, "Brass Boots", 32, 10, 6, 44, 100, 30, 0, 1, 0);
this.CreateBoots(9, 6, 2, 2, "Plate Boots", 42, 12, 4, 50, 130, 0, 0, 1, 0);
this.CreateBoots(10, 6, 2, 2, "Vine Boots", 5, 2, 0, 22, 30, 60, 0, 0, 1);
this.CreateBoots(11, 6, 2, 2, "Silk Boots", 15, 4, 0, 26, 30, 70, 0, 0, 1);
this.CreateBoots(12, 6, 2, 2, "Wind Boots", 27, 7, 0, 32, 30, 80, 0, 0, 1);
this.CreateBoots(13, 6, 2, 2, "Spirit Boots", 40, 10, 0, 38, 40, 80, 0, 0, 1);
this.CreateBoots(14, 6, 2, 2, "Guardian Boots", 52, 16, 0, 45, 40, 80, 0, 0, 1);
this.BuildSets();
}
}

View File

@@ -0,0 +1,21 @@
// <copyright file="Constants.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.Version075.Items;
/// <summary>
/// Constants for this game version.
/// </summary>
internal static class Constants
{
/// <summary>
/// Gets the maximum item level.
/// </summary>
public static byte MaximumItemLevel => 11;
/// <summary>
/// Gets the maximum option level.
/// </summary>
public static byte MaximumOptionLevel => 4;
}

View File

@@ -0,0 +1,216 @@
// <copyright file="Jewelery.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.Version075.Items;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
/// <summary>
/// Initializer for jewelery (rings and pendants).
/// </summary>
internal class Jewelery : InitializerBase
{
private static readonly float[] ResistanceIncreaseByLevel = { 0, 1, 2, 3, 4 };
private ItemOptionDefinition? _healthRecoverOptionDefinition;
private ItemLevelBonusTable? _resistancesBonusTable;
/// <summary>
/// Initializes a new instance of the <see cref="Jewelery"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Jewelery(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override int MaximumOptionLevel => 3;
/// <inheritdoc/>
public sealed override void Initialize()
{
this._healthRecoverOptionDefinition = this.CreateOption("Health recover for jewelery", Stats.HealthRecoveryMultiplier, 0.01f, ItemOptionDefinitionNumbers.JeweleryHealth);
this._resistancesBonusTable = this.CreateItemBonusTable(ResistanceIncreaseByLevel, "Elemental resistances (Jewelery)", "Defines the elemental resistances for jewelery. It's 1 per item level.");
this.CreateItems();
}
/// <summary>
/// Creates the items.
/// </summary>
protected virtual void CreateItems()
{
this.CreateRing(8, "Ring of Ice", 20, 50, Stats.IceResistance);
this.CreateRing(9, "Ring of Poison", 17, 50, Stats.PoisonResistance);
this.CreatePendant(12, "Pendant of Lighting", 21, 50, Stats.LightningResistance);
this.CreatePendant(13, "Pendant of Fire", 13, 50, Stats.FireResistance);
this.CreateTransformationRing(
10,
"Transformation Ring",
0,
200,
20, // It's actually lvl 50 for the last 3
CharacterTransformationSkin.BudgeDragon,
CharacterTransformationSkin.Giant,
CharacterTransformationSkin.SkeletonWarrior,
CharacterTransformationSkin.PoisonBullFighter,
CharacterTransformationSkin.ThunderLich,
CharacterTransformationSkin.DeathCow);
}
/// <summary>
/// Creates a transformation ring.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="name">The name.</param>
/// <param name="dropLevel">The level.</param>
/// <param name="durability">The durability.</param>
/// <param name="requiredlevel">The required level to wear.</param>
/// <param name="transformationSkins">The transformation skins, per item level.</param>
/// <returns>The definition of the created ring.</returns>
protected ItemDefinition CreateTransformationRing(byte number, string name, byte dropLevel, byte durability, byte requiredlevel, params CharacterTransformationSkin[] transformationSkins)
{
var ring = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(ring);
ring.Group = 13;
ring.Number = number;
ring.ItemSlot = this.GameConfiguration.ItemSlotTypes.FirstOrDefault(slotType => slotType.ItemSlots.Contains(10));
ring.Name = name;
ring.DropLevel = dropLevel;
ring.Durability = durability;
ring.MaximumItemLevel = (byte)(transformationSkins.Length - 1);
ring.Width = 1;
ring.Height = 1;
this.CreateItemRequirementIfNeeded(ring, Stats.Level, requiredlevel);
var powerUp = this.Context.CreateNew<ItemBasePowerUpDefinition>();
ring.BasePowerUpAttributes.Add(powerUp);
powerUp.BaseValue = 0;
powerUp.TargetAttribute = Stats.TransformationSkin.GetPersistent(this.GameConfiguration);
powerUp.BonusPerLevelTable = this.CreateItemBonusTable(transformationSkins.Select(v => (float)v).ToArray(), $"Transformation Ring Skins ({name})", $"Contains the skin numbers for the different levels of the transformation ring ({name}).");
foreach (var characterClass in this.GameConfiguration.CharacterClasses)
{
ring.QualifiedCharacters.Add(characterClass);
}
ring.SetGuid(ring.Group, ring.Number);
return ring;
}
/// <summary>
/// Creates the option.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="targetAttribute">The target attribute.</param>
/// <param name="boostPerLevel">The boost per level.</param>
/// <param name="optionNumber">The option number.</param>
/// <param name="aggregateType">Type of the aggregate.</param>
/// <returns>
/// The created option.
/// </returns>
protected ItemOptionDefinition CreateOption(string name, AttributeDefinition targetAttribute, float boostPerLevel, short optionNumber, AggregateType aggregateType = AggregateType.AddRaw)
{
var optionDefinition = this.Context.CreateNew<ItemOptionDefinition>();
optionDefinition.SetGuid(optionNumber, targetAttribute.Id.ExtractFirstTwoBytes());
optionDefinition.AddsRandomly = true;
optionDefinition.Name = name;
optionDefinition.AddChance = 0.25f;
optionDefinition.MaximumOptionsPerItem = 1;
var option = this.CreateItemOption(0, targetAttribute, 0, aggregateType, boostPerLevel, optionNumber);
optionDefinition.PossibleOptions.Add(option);
this.GameConfiguration.ItemOptions.Add(optionDefinition);
return optionDefinition;
}
/// <summary>
/// Creates the jewelery.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="slot">The slot.</param>
/// <param name="dropsFromMonsters">if set to <c>true</c> [drops from monsters].</param>
/// <param name="name">The name.</param>
/// <param name="level">The level.</param>
/// <param name="durability">The durability.</param>
/// <param name="resistanceAttribute">The resistance attribute.</param>
/// <param name="withHealthOption">if set to <c>true</c> [with health option].</param>
/// <returns>The created jewelery.</returns>
protected ItemDefinition CreateJewelery(byte number, int slot, bool dropsFromMonsters, string name, byte level, byte durability, AttributeDefinition? resistanceAttribute, bool withHealthOption = true)
{
var item = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(item);
item.Group = 13;
item.Number = number;
item.ItemSlot = this.GameConfiguration.ItemSlotTypes.FirstOrDefault(slotType => slotType.ItemSlots.Contains(slot));
item.DropsFromMonsters = dropsFromMonsters;
item.Name = name;
item.DropLevel = level;
item.MaximumItemLevel = 4;
item.Width = 1;
item.Height = 1;
item.Durability = durability;
//// TODO: Requirement increases with item level
this.CreateItemRequirementIfNeeded(item, Stats.Level, level);
if (withHealthOption)
{
item.PossibleItemOptions.Add(this._healthRecoverOptionDefinition!);
}
if (resistanceAttribute != null)
{
var powerUp = this.CreateItemBasePowerUpDefinition(resistanceAttribute, 1f, AggregateType.Maximum);
powerUp.BonusPerLevelTable = this._resistancesBonusTable;
item.BasePowerUpAttributes.Add(powerUp);
}
foreach (var characterClass in this.GameConfiguration.CharacterClasses)
{
item.QualifiedCharacters.Add(characterClass);
}
item.SetGuid(item.Group, item.Number);
return item;
}
/// <summary>
/// Creates a ring.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="name">The name.</param>
/// <param name="level">The level.</param>
/// <param name="durability">The durability.</param>
/// <param name="resistanceAttribute">The resistance attribute.</param>
/// <remarks>
/// Rings always have defensive excellent options.
/// </remarks>
private void CreateRing(byte number, string name, byte level, byte durability, AttributeDefinition? resistanceAttribute)
{
this.CreateJewelery(number, 10, true, name, level, durability, resistanceAttribute);
}
/// <summary>
/// Creates a pendant.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="name">The name.</param>
/// <param name="level">The level.</param>
/// <param name="durability">The durability.</param>
/// <param name="resistanceAttribute">The resistance attribute.</param>
/// <remarks>
/// Pendants always have offensive excellent options. If it's wizardry or physical depends on the specific item. I didn't find a pattern yet.
/// </remarks>
private void CreatePendant(byte number, string name, byte level, byte durability, AttributeDefinition? resistanceAttribute)
{
this.CreateJewelery(number, 9, true, name, level, durability, resistanceAttribute);
}
}

View File

@@ -0,0 +1,95 @@
// <copyright file="Jewels.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
/// <summary>
/// Jewels for MU Version 0.75.
/// </summary>
public class Jewels : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Jewels"/> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Jewels(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
public override void Initialize()
{
this.GameConfiguration.Items.Add(this.CreateJewelOfBless());
this.GameConfiguration.Items.Add(this.CreateJewelOfSoul());
this.GameConfiguration.Items.Add(this.CreateJewelOfChaos());
}
/// <summary>
/// Creates an <see cref="ItemDefinition"/> for the 'Jewel of Bless'.
/// </summary>
/// <returns><see cref="ItemDefinition"/> for the 'Jewel of Bless'.</returns>
private ItemDefinition CreateJewelOfBless()
{
var itemDefinition = this.Context.CreateNew<ItemDefinition>();
itemDefinition.Name = "Jewel of Bless";
itemDefinition.Number = 13;
itemDefinition.Group = 14;
itemDefinition.DropsFromMonsters = false;
itemDefinition.DropLevel = 25;
itemDefinition.Durability = 1;
itemDefinition.Width = 1;
itemDefinition.Height = 1;
itemDefinition.Value = 150;
itemDefinition.SetGuid(itemDefinition.Group, itemDefinition.Number);
this.AddItemToJewelItemDrop(itemDefinition);
return itemDefinition;
}
/// <summary>
/// Creates an <see cref="ItemDefinition"/> for the 'Jewel of Bless'.
/// </summary>
/// <returns><see cref="ItemDefinition"/> for the 'Jewel of Bless'.</returns>
private ItemDefinition CreateJewelOfSoul()
{
var itemDefinition = this.Context.CreateNew<ItemDefinition>();
itemDefinition.Name = "Jewel of Soul";
itemDefinition.Number = 14;
itemDefinition.Group = 14;
itemDefinition.DropsFromMonsters = false;
itemDefinition.DropLevel = 30;
itemDefinition.Durability = 1;
itemDefinition.Width = 1;
itemDefinition.Height = 1;
itemDefinition.Value = 150;
itemDefinition.SetGuid(itemDefinition.Group, itemDefinition.Number);
this.AddItemToJewelItemDrop(itemDefinition);
return itemDefinition;
}
/// <summary>
/// Creates an <see cref="ItemDefinition"/> for the 'Jewel of Chaos'.
/// </summary>
/// <returns><see cref="ItemDefinition"/> for the 'Jewel of Chaos'.</returns>
private ItemDefinition CreateJewelOfChaos()
{
var itemDefinition = this.Context.CreateNew<ItemDefinition>();
itemDefinition.Name = "Jewel of Chaos";
itemDefinition.Number = 15;
itemDefinition.Group = 12;
itemDefinition.DropsFromMonsters = false;
itemDefinition.DropLevel = 12;
itemDefinition.MaximumDropLevel = 66;
itemDefinition.Durability = 1;
itemDefinition.Width = 1;
itemDefinition.Height = 1;
itemDefinition.SetGuid(itemDefinition.Group, itemDefinition.Number);
this.AddItemToJewelItemDrop(itemDefinition);
return itemDefinition;
}
}

View File

@@ -0,0 +1,84 @@
// <copyright file="Orbs.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// Initializes orb items which are used to learn skills.
/// </summary>
internal class Orbs : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Orbs"/> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Orbs(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Initializes all orbs.
/// </summary>
public override void Initialize()
{
this.CreateOrb(8, SkillNumber.Heal, 1, "Orb of Healing", 8, 0, 100, 0, 0, 800, CharacterClasses.FairyElf);
this.CreateOrb(9, SkillNumber.GreaterDefense, 1, "Orb of Greater Defense", 13, 0, 100, 0, 0, 3000, CharacterClasses.FairyElf);
this.CreateOrb(10, SkillNumber.GreaterDamage, 1, "Orb of Greater Damage", 18, 0, 100, 0, 0, 7000, CharacterClasses.FairyElf);
var summonOrb = this.CreateOrb(11, SkillNumber.SummonGoblin, 1, "Orb of Summoning", 3, 0, 0, 0, 0, 150, CharacterClasses.FairyElf);
summonOrb.MaximumItemLevel = 5;
}
/// <summary>
/// Creates the orb definition.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="skillNumber">The skill number.</param>
/// <param name="height">The height.</param>
/// <param name="name">The name.</param>
/// <param name="dropLevel">The drop level.</param>
/// <param name="levelRequirement">The level requirement.</param>
/// <param name="energyRequirement">The energy requirement.</param>
/// <param name="strengthRequirement">The strength requirement.</param>
/// <param name="agilityRequirement">The agility requirement.</param>
/// <param name="money">The money.</param>
/// <param name="characterClasses">The character classes.</param>
/// <returns>The created definition.</returns>
protected ItemDefinition CreateOrb(byte number, SkillNumber skillNumber, byte height, string name, byte dropLevel, int levelRequirement, int energyRequirement, int strengthRequirement, int agilityRequirement, int money, CharacterClasses characterClasses)
{
var orb = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(orb);
orb.Group = 12;
orb.Number = number;
orb.Skill = this.GameConfiguration.Skills.First(skill => skill.Number == (short)skillNumber);
orb.Width = 1;
orb.Height = height;
orb.Name = name;
orb.DropLevel = dropLevel;
orb.DropsFromMonsters = true;
orb.Durability = 1;
this.CreateItemRequirementIfNeeded(orb, Stats.Level, levelRequirement);
this.CreateItemRequirementIfNeeded(orb, Stats.TotalEnergy, energyRequirement);
this.CreateItemRequirementIfNeeded(orb, Stats.TotalStrength, strengthRequirement);
this.CreateItemRequirementIfNeeded(orb, Stats.TotalAgility, agilityRequirement);
orb.Value = money;
var classes = this.GameConfiguration.DetermineCharacterClasses(characterClasses);
foreach (var characterClass in classes)
{
orb.QualifiedCharacters.Add(characterClass);
}
orb.SetGuid(orb.Group, orb.Number);
return orb;
}
}

View File

@@ -0,0 +1,72 @@
// <copyright file="Pets.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.Version075.Items;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
/// <summary>
/// Initializer for pets.
/// </summary>
public class Pets : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Pets"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Pets(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
public override void Initialize()
{
var angel = this.CreatePet(0, "Guardian Angel", 23, (Stats.DamageReceiveDecrement, 0.8f, AggregateType.Multiplicate), (Stats.MaximumHealth, 50f, AggregateType.AddRaw));
this.AddItemToJewelItemDrop(angel);
var imp = this.CreatePet(1, "Imp", 28, (Stats.AttackDamageIncrease, 1.3f, AggregateType.Multiplicate));
this.AddItemToJewelItemDrop(imp);
var uniria = this.CreatePet(2, "Horn of Uniria", 25, (Stats.MovementSpeed, MovementSpeedConstants.BasicMountMovementSpeed, AggregateType.Maximum), (Stats.MovementSpeedUnderwater, MovementSpeedConstants.BasicMountMovementSpeed, AggregateType.Maximum));
this.AddItemToJewelItemDrop(uniria);
}
private ItemDefinition CreatePet(byte number, string name, int dropLevelAndLevelRequirement, params (AttributeDefinition, float, AggregateType)[] basePowerUps)
{
var pet = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(pet);
pet.Group = 13;
pet.Number = number;
pet.Width = 1;
pet.Height = 1;
pet.Name = name;
pet.DropLevel = (byte)System.Math.Min(255, dropLevelAndLevelRequirement);
pet.DropsFromMonsters = true;
pet.Durability = 255;
pet.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(st => st.ItemSlots.Contains(8));
this.GameConfiguration.DetermineCharacterClasses(true, true, true).ForEach(pet.QualifiedCharacters.Add);
this.CreateItemRequirementIfNeeded(pet, Stats.Level, dropLevelAndLevelRequirement);
foreach (var basePowerUp in basePowerUps)
{
if (basePowerUp.Item1 != null)
{
var powerUpDefinition = this.Context.CreateNew<ItemBasePowerUpDefinition>();
powerUpDefinition.TargetAttribute = basePowerUp.Item1.GetPersistent(this.GameConfiguration);
powerUpDefinition.BaseValue = basePowerUp.Item2;
powerUpDefinition.AggregateType = basePowerUp.Item3;
pet.BasePowerUpAttributes.Add(powerUpDefinition);
}
}
pet.SetGuid(pet.Group, pet.Number);
return pet;
}
}

View File

@@ -0,0 +1,237 @@
// <copyright file="Potions.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// Class which contains item definitions for jewels.
/// </summary>
public class Potions : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Potions"/> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Potions(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Creates the potion item definitions.
/// </summary>
public override void Initialize()
{
this.GameConfiguration.Items.Add(this.CreateApple());
this.GameConfiguration.Items.Add(this.CreateSmallHealingPotion());
this.GameConfiguration.Items.Add(this.CreateMediumHealingPotion());
this.GameConfiguration.Items.Add(this.CreateLargeHealingPotion());
this.GameConfiguration.Items.Add(this.CreateSmallManaPotion());
this.GameConfiguration.Items.Add(this.CreateMediumManaPotion());
this.GameConfiguration.Items.Add(this.CreateLargeManaPotion());
this.GameConfiguration.Items.Add(this.CreateAlcohol());
this.GameConfiguration.Items.Add(this.CreateAntidotePotion());
this.GameConfiguration.Items.Add(this.CreateTownPortalScroll());
}
private ItemDefinition CreateAlcohol()
{
var alcohol = this.Context.CreateNew<ItemDefinition>();
alcohol.Name = "Ale";
alcohol.Number = 9;
alcohol.Group = 14;
alcohol.DropsFromMonsters = true;
alcohol.DropLevel = 15;
alcohol.Durability = 1;
alcohol.Value = 30;
alcohol.Width = 1;
alcohol.Height = 2;
alcohol.SetGuid(alcohol.Group, alcohol.Number);
alcohol.ConsumeEffect = this.GameConfiguration.MagicEffects.First(effect => effect.Number == (short)MagicEffectNumber.Alcohol);
this.AddItemToJewelItemDrop(alcohol);
return alcohol;
}
/// <summary>
/// Creates the apple definition.
/// </summary>
/// <returns>The created apple definition.</returns>
private ItemDefinition CreateApple()
{
var apple = this.Context.CreateNew<ItemDefinition>();
apple.Name = "Apple";
apple.Number = 0;
apple.Group = 14;
apple.DropsFromMonsters = true;
apple.DropLevel = 1;
apple.Durability = 3;
apple.Value = 5;
apple.Width = 1;
apple.Height = 1;
apple.SetGuid(apple.Group, apple.Number);
return apple;
}
/// <summary>
/// Gets the small healing potion definition.
/// </summary>
/// <returns>The created small healing potion definition.</returns>
private ItemDefinition CreateSmallHealingPotion()
{
var potion = this.Context.CreateNew<ItemDefinition>();
potion.Name = "Small Healing Potion";
potion.Number = 1;
potion.Group = 14;
potion.DropsFromMonsters = true;
potion.DropLevel = 10;
potion.Durability = 3;
potion.Value = 10;
potion.Width = 1;
potion.Height = 1;
potion.SetGuid(potion.Group, potion.Number);
return potion;
}
/// <summary>
/// Gets the medium healing potion definition.
/// </summary>
/// <returns>The created medium healing potion definition.</returns>
private ItemDefinition CreateMediumHealingPotion()
{
var potion = this.Context.CreateNew<ItemDefinition>();
potion.Name = "Medium Healing Potion";
potion.Number = 2;
potion.Group = 14;
potion.DropsFromMonsters = true;
potion.DropLevel = 25;
potion.Durability = 3;
potion.Value = 20;
potion.Width = 1;
potion.Height = 1;
potion.SetGuid(potion.Group, potion.Number);
return potion;
}
/// <summary>
/// Gets the large healing potion definition.
/// </summary>
/// <returns>The created large healing definition.</returns>
private ItemDefinition CreateLargeHealingPotion()
{
var definition = this.Context.CreateNew<ItemDefinition>();
definition.Name = "Large Healing Potion";
definition.Number = 3;
definition.Group = 14;
definition.DropsFromMonsters = true;
definition.DropLevel = 40;
definition.Durability = 3;
definition.Value = 30;
definition.Width = 1;
definition.Height = 1;
definition.SetGuid(definition.Group, definition.Number);
return definition;
}
/// <summary>
/// Gets the small mana potion definition.
/// </summary>
/// <returns>The created small mana potion definition.</returns>
private ItemDefinition CreateSmallManaPotion()
{
var potion = this.Context.CreateNew<ItemDefinition>();
potion.Name = "Small Mana Potion";
potion.Number = 4;
potion.Group = 14;
potion.DropsFromMonsters = true;
potion.DropLevel = 10;
potion.Durability = 3;
potion.Value = 10;
potion.Width = 1;
potion.Height = 1;
potion.SetGuid(potion.Group, potion.Number);
return potion;
}
/// <summary>
/// Gets the medium mana potion definition.
/// </summary>
/// <returns>The created medium mana potion definition.</returns>
private ItemDefinition CreateMediumManaPotion()
{
var potion = this.Context.CreateNew<ItemDefinition>();
potion.Name = "Medium Mana Potion";
potion.Number = 5;
potion.Group = 14;
potion.DropsFromMonsters = true;
potion.DropLevel = 25;
potion.Durability = 3;
potion.Value = 20;
potion.Width = 1;
potion.Height = 1;
potion.SetGuid(potion.Group, potion.Number);
return potion;
}
/// <summary>
/// Gets the large mana potion definition.
/// </summary>
/// <returns>The created large mana definition.</returns>
private ItemDefinition CreateLargeManaPotion()
{
var definition = this.Context.CreateNew<ItemDefinition>();
definition.Name = "Large Mana Potion";
definition.Number = 6;
definition.Group = 14;
definition.DropsFromMonsters = true;
definition.DropLevel = 40;
definition.Durability = 3;
definition.Value = 30;
definition.Width = 1;
definition.Height = 1;
definition.SetGuid(definition.Group, definition.Number);
return definition;
}
/// <summary>
/// Gets the antidote definition.
/// </summary>
/// <returns>The created antidote definition.</returns>
private ItemDefinition CreateAntidotePotion()
{
var definition = this.Context.CreateNew<ItemDefinition>();
definition.Name = "Antidote";
definition.Number = 8;
definition.Group = 14;
definition.DropsFromMonsters = true;
definition.DropLevel = 10;
definition.Durability = 3;
definition.Value = 10;
definition.Width = 1;
definition.Height = 1;
definition.SetGuid(definition.Group, definition.Number);
return definition;
}
private ItemDefinition CreateTownPortalScroll()
{
var definition = this.Context.CreateNew<ItemDefinition>();
definition.Name = "Town Portal Scroll";
definition.Number = 10;
definition.Group = 14;
definition.DropsFromMonsters = true;
definition.DropLevel = 30;
definition.Durability = 1;
definition.Value = 30;
definition.Width = 1;
definition.Height = 2;
definition.SetGuid(definition.Group, definition.Number);
this.AddItemToJewelItemDrop(definition);
return definition;
}
}

View File

@@ -0,0 +1,78 @@
// <copyright file="Scrolls.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
/// <summary>
/// Initializer for scroll items which allow a character to learn <see cref="Skill"/>s.
/// </summary>
/// <seealso cref="MUnique.OpenMU.Persistence.Initialization.InitializerBase" />
public class Scrolls : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="Scrolls"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Scrolls(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Initializes the scroll data.
/// </summary>
public override void Initialize()
{
this.CreateScroll(0, 1, "Scroll of Poison", 30, 0, 140, 17000);
this.CreateScroll(1, 2, "Scroll of Meteorite", 21, 0, 104, 11000);
this.CreateScroll(2, 3, "Scroll of Lighting", 13, 0, 72, 3000);
this.CreateScroll(3, 4, "Scroll of Fire Ball", 5, 0, 40, 300);
this.CreateScroll(4, 5, "Scroll of Flame", 35, 0, 160, 21000);
this.CreateScroll(5, 6, "Scroll of Teleport", 17, 0, 88, 5000);
this.CreateScroll(6, 7, "Scroll of Ice", 25, 0, 120, 14000);
this.CreateScroll(7, 8, "Scroll of Twister", 40, 0, 180, 25000);
this.CreateScroll(8, 9, "Scroll of Evil Spirit", 50, 0, 220, 35000);
this.CreateScroll(9, 10, "Scroll of Hellfire", 60, 0, 260, 60000);
this.CreateScroll(10, 11, "Scroll of Power Wave", 9, 0, 56, 1100);
this.CreateScroll(11, 12, "Scroll of Aqua Beam", 74, 0, 345, 100000);
}
/// <summary>
/// Creates the scroll.
/// </summary>
/// <param name="number">The number.</param>
/// <param name="skillNumber">The skill number.</param>
/// <param name="name">The name.</param>
/// <param name="dropLevel">The drop level.</param>
/// <param name="levelRequirement">The level requirement.</param>
/// <param name="energyRequirement">The energy requirement.</param>
/// <param name="money">The money.</param>
protected void CreateScroll(byte number, int skillNumber, string name, byte dropLevel, int levelRequirement, int energyRequirement, int money)
{
var scroll = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(scroll);
scroll.Group = 15;
scroll.Number = number;
scroll.Skill = this.GameConfiguration.Skills.First(skill => skill.Number == skillNumber);
scroll.Width = 1;
scroll.Height = 2;
scroll.Name = name;
scroll.DropLevel = dropLevel;
scroll.DropsFromMonsters = true;
scroll.Durability = 1;
scroll.QualifiedCharacters.Add(this.GameConfiguration.CharacterClasses.First(c => c.Number == (int)CharacterClassNumber.DarkWizard));
this.CreateItemRequirementIfNeeded(scroll, Stats.Level, levelRequirement);
this.CreateItemRequirementIfNeeded(scroll, Stats.TotalEnergyRequirementValue, energyRequirement);
scroll.Value = money;
scroll.SetGuid(scroll.Group, scroll.Number);
}
}

View File

@@ -0,0 +1,102 @@
// <copyright file="SlotTypesInitializer.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.Version075.Items;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
/// <summary>
/// Initializer for <see cref="ItemSlotType"/>s.
/// </summary>
public class SlotTypesInitializer : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="SlotTypesInitializer"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public SlotTypesInitializer(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
public override void Initialize()
{
var leftHand = this.Context.CreateNew<ItemSlotType>();
leftHand.SetGuid(100);
leftHand.Description = "Left Hand";
leftHand.ItemSlots.Add(0);
this.GameConfiguration.ItemSlotTypes.Add(leftHand);
var rightHand = this.Context.CreateNew<ItemSlotType>();
rightHand.SetGuid(101);
rightHand.Description = "Right Hand";
rightHand.ItemSlots.Add(1);
this.GameConfiguration.ItemSlotTypes.Add(rightHand);
var leftOrRightHand = this.Context.CreateNew<ItemSlotType>();
leftOrRightHand.SetGuid(1);
leftOrRightHand.Description = "Left or Right Hand";
leftOrRightHand.ItemSlots.Add(0);
leftOrRightHand.ItemSlots.Add(1);
this.GameConfiguration.ItemSlotTypes.Add(leftOrRightHand);
var helm = this.Context.CreateNew<ItemSlotType>();
helm.SetGuid(2);
helm.Description = "Helm";
helm.ItemSlots.Add(2);
this.GameConfiguration.ItemSlotTypes.Add(helm);
var armor = this.Context.CreateNew<ItemSlotType>();
armor.SetGuid(3);
armor.Description = "Armor";
armor.ItemSlots.Add(3);
this.GameConfiguration.ItemSlotTypes.Add(armor);
var pants = this.Context.CreateNew<ItemSlotType>();
pants.SetGuid(4);
pants.Description = "Pants";
pants.ItemSlots.Add(4);
this.GameConfiguration.ItemSlotTypes.Add(pants);
var gloves = this.Context.CreateNew<ItemSlotType>();
gloves.SetGuid(5);
gloves.Description = "Gloves";
gloves.ItemSlots.Add(5);
this.GameConfiguration.ItemSlotTypes.Add(gloves);
var boots = this.Context.CreateNew<ItemSlotType>();
boots.SetGuid(6);
boots.Description = "Boots";
boots.ItemSlots.Add(6);
this.GameConfiguration.ItemSlotTypes.Add(boots);
var wings = this.Context.CreateNew<ItemSlotType>();
wings.SetGuid(7);
wings.Description = "Wings";
wings.ItemSlots.Add(7);
this.GameConfiguration.ItemSlotTypes.Add(wings);
var pet = this.Context.CreateNew<ItemSlotType>();
pet.SetGuid(8);
pet.Description = "Pet";
pet.ItemSlots.Add(8);
this.GameConfiguration.ItemSlotTypes.Add(pet);
var pendant = this.Context.CreateNew<ItemSlotType>();
pendant.SetGuid(9);
pendant.Description = "Pendant";
pendant.ItemSlots.Add(9);
this.GameConfiguration.ItemSlotTypes.Add(pendant);
var ring = this.Context.CreateNew<ItemSlotType>();
ring.SetGuid(10);
ring.Description = "Ring";
ring.ItemSlots.Add(10);
ring.ItemSlots.Add(11);
this.GameConfiguration.ItemSlotTypes.Add(ring);
}
}

View File

@@ -0,0 +1,337 @@
// <copyright file="Weapons.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.Version075.Items;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
using MUnique.OpenMU.Persistence.Initialization.Items;
/// <summary>
/// Helper class to create weapon item definitions.
/// </summary>
internal class Weapons : InitializerBase
{
/// <summary>
/// The durability increase per level.
/// </summary>
protected static readonly float[] DurabilityIncreasePerLevel = { 0, 1, 2, 3, 4, 6, 8, 10, 12, 14, 17, 21 };
/// <summary>
/// The weapon damage increase by level.
/// </summary>
private static readonly float[] DamageIncreaseByLevel = { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 31, 36 };
private static readonly float[] StaffRiseIncreaseByLevelEven = { 0, 3, 7, 10, 14, 17, 21, 24, 28, 31, 35, 40, 45, 50, 56, 63 }; // Staff with even magic power
private static readonly float[] StaffRiseIncreaseByLevelOdd = { 0, 4, 7, 11, 14, 18, 21, 25, 28, 32, 36, 40, 45, 51, 57, 63 }; // Staff with odd magic power
private ItemLevelBonusTable? _weaponDamageIncreaseTable;
private ItemLevelBonusTable? _staffRiseTableEven;
private ItemLevelBonusTable? _staffRiseTableOdd;
/// <summary>
/// Initializes a new instance of the <see cref="Weapons" /> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configration.</param>
public Weapons(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Gets the luck item option definition.
/// </summary>
protected ItemOptionDefinition Luck
{
get
{
return this.GameConfiguration.ItemOptions.First(iod => iod.PossibleOptions.Any(o => o.OptionType == ItemOptionTypes.Luck));
}
}
/// <summary>
/// Gets the physical damage option definition.
/// </summary>
protected ItemOptionDefinition PhysicalDamageOption
{
get
{
return this.GameConfiguration.ItemOptions.First(iod => iod.PossibleOptions.Any(o => o.OptionType == ItemOptionTypes.Option && o.PowerUpDefinition?.TargetAttribute == Stats.PhysicalBaseDmg));
}
}
/// <summary>
/// Gets the wizardry damage option definition.
/// </summary>
protected ItemOptionDefinition WizardryDamageOption
{
get
{
return this.GameConfiguration.ItemOptions.First(iod => iod.PossibleOptions.Any(o => o.OptionType == ItemOptionTypes.Option && o.PowerUpDefinition?.TargetAttribute == Stats.WizardryBaseDmg));
}
}
/// <summary>
/// Initializes the weapons.
/// </summary>
public override void Initialize()
{
this._weaponDamageIncreaseTable = this.CreateItemBonusTable(DamageIncreaseByLevel, "Damage Increase (Weapons)", "The damage increase by weapon level. It increases by 3 per level, and 1 more after level 10.");
this._staffRiseTableEven = this.CreateItemBonusTable(StaffRiseIncreaseByLevelEven, "Staff Rise (even)", "The staff rise bonus per item level for even magic power staves.");
this._staffRiseTableOdd = this.CreateItemBonusTable(StaffRiseIncreaseByLevelOdd, "Staff Rise (odd)", "The staff rise bonus per item level for odd magic power staves.");
this.CreateWeapon(0, 0, 0, 0, 1, 2, true, "Kris", 6, 6, 11, 50, 20, 0, 0, 40, 40, 0, 0, 1, 1, 1);
this.CreateWeapon(0, 1, 0, 0, 1, 3, true, "Short Sword", 3, 3, 7, 20, 22, 0, 0, 60, 0, 0, 0, 1, 1, 1);
this.CreateWeapon(0, 2, 0, 0, 1, 3, true, "Rapier", 9, 9, 15, 40, 23, 0, 0, 50, 40, 0, 0, 0, 1, 1);
this.CreateWeapon(0, 3, 0, 20, 1, 3, true, "Katache", 16, 16, 26, 35, 27, 0, 0, 80, 40, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 4, 0, 21, 1, 3, true, "Sword of Assassin", 12, 12, 18, 30, 24, 0, 0, 60, 40, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 5, 0, 22, 1, 3, true, "Blade", 36, 36, 47, 30, 39, 0, 0, 80, 50, 0, 0, 1, 1, 1);
this.CreateWeapon(0, 6, 0, 20, 1, 3, true, "Gladius", 20, 20, 30, 20, 30, 0, 0, 110, 0, 0, 0, 0, 1, 1);
this.CreateWeapon(0, 7, 0, 21, 1, 3, true, "Falchion", 24, 24, 34, 25, 34, 0, 0, 120, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 8, 0, 21, 1, 3, true, "Serpent Sword", 30, 30, 40, 20, 36, 0, 0, 130, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 9, 0, 20, 2, 3, true, "Sword of Salamander", 32, 32, 46, 30, 40, 0, 0, 103, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 10, 0, 22, 2, 4, true, "Light Saber", 40, 47, 61, 25, 50, 0, 0, 80, 60, 0, 0, 0, 1, 1);
this.CreateWeapon(0, 11, 0, 20, 2, 3, true, "Legendary Sword", 44, 56, 72, 20, 54, 0, 0, 120, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 12, 0, 19, 2, 3, true, "Heliacal Sword", 56, 73, 98, 25, 66, 0, 0, 140, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(0, 13, 0, 22, 1, 3, true, "Double Blade", 48, 48, 56, 30, 43, 0, 0, 70, 70, 0, 0, 0, 1, 1);
this.CreateWeapon(0, 14, 0, 22, 1, 3, true, "Lighting Sword", 59, 59, 67, 30, 50, 0, 0, 90, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(0, 15, 0, 23, 2, 3, true, "Giant Sword", 52, 60, 85, 20, 60, 0, 0, 140, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(1, 0, 0, 0, 1, 3, true, "Small Axe", 1, 1, 6, 20, 18, 0, 0, 50, 0, 0, 0, 1, 1, 1);
this.CreateWeapon(1, 1, 0, 0, 1, 3, true, "Hand Axe", 4, 4, 9, 30, 20, 0, 0, 70, 0, 0, 0, 1, 1, 1);
this.CreateWeapon(1, 2, 0, 19, 1, 3, true, "Double Axe", 14, 14, 24, 20, 26, 0, 0, 90, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(1, 3, 0, 19, 1, 3, true, "Tomahawk", 18, 18, 28, 30, 28, 0, 0, 100, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(1, 4, 0, 0, 1, 3, true, "Elven Axe", 26, 26, 38, 40, 32, 0, 0, 50, 70, 0, 0, 1, 0, 1);
this.CreateWeapon(1, 5, 0, 19, 2, 3, true, "Battle Axe", 30, 36, 44, 20, 36, 0, 0, 120, 0, 0, 0, 0, 1, 1);
this.CreateWeapon(1, 6, 0, 19, 2, 3, true, "Nikkea Axe", 34, 38, 50, 30, 44, 0, 0, 130, 0, 0, 0, 0, 1, 1);
this.CreateWeapon(1, 7, 0, 19, 2, 3, true, "Larkan Axe", 46, 54, 67, 25, 55, 0, 0, 140, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(1, 8, 0, 19, 2, 3, true, "Crescent Axe", 54, 69, 89, 30, 65, 0, 0, 100, 40, 0, 0, 1, 1, 0);
this.CreateWeapon(2, 0, 0, 0, 1, 3, true, "Mace", 7, 7, 13, 15, 21, 0, 0, 100, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(2, 1, 0, 19, 1, 3, true, "Morning Star", 13, 13, 22, 15, 25, 0, 0, 100, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(2, 2, 0, 0, 1, 3, true, "Flail", 22, 22, 32, 15, 32, 0, 0, 80, 50, 0, 0, 0, 1, 0);
this.CreateWeapon(2, 3, 0, 19, 2, 3, true, "Great Hammer", 38, 45, 56, 15, 50, 0, 0, 150, 0, 0, 0, 0, 1, 0);
this.CreateWeapon(2, 4, 0, 19, 2, 3, true, "Crystal Morning Star", 66, 78, 107, 30, 72, 0, 0, 130, 0, 0, 0, 1, 1, 1);
this.CreateWeapon(2, 5, 0, 23, 2, 4, true, "Crystal Sword", 72, 89, 120, 40, 76, 0, 0, 130, 70, 0, 0, 1, 1, 1);
this.CreateWeapon(2, 6, 0, 23, 2, 4, false, "Chaos Dragon Axe", 75, 102, 130, 35, 80, 0, 0, 140, 50, 0, 0, 0, 1, 0);
this.CreateWeapon(3, 0, 0, 22, 2, 4, true, "Light Spear", 42, 50, 63, 25, 56, 0, 0, 60, 70, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 1, 0, 0, 2, 4, true, "Spear", 23, 30, 41, 30, 42, 0, 0, 70, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 2, 0, 0, 2, 4, true, "Dragon Lance", 15, 21, 33, 30, 34, 0, 0, 70, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 3, 0, 0, 2, 4, true, "Giant Trident", 29, 35, 43, 25, 44, 0, 0, 90, 30, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 4, 0, 20, 2, 4, true, "Serpent Spear", 46, 58, 80, 20, 58, 0, 0, 90, 30, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 5, 0, 0, 2, 4, true, "Double Poleaxe", 13, 19, 31, 30, 38, 0, 0, 70, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 6, 0, 0, 2, 4, true, "Halberd", 19, 25, 35, 30, 40, 0, 0, 70, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 7, 0, 22, 2, 4, true, "Berdysh", 37, 42, 54, 30, 54, 0, 0, 80, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 8, 0, 22, 2, 4, true, "Great Scythe", 54, 71, 92, 25, 68, 0, 0, 90, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(3, 9, 0, 22, 2, 4, true, "Bill of Balrog", 63, 76, 102, 25, 74, 0, 0, 80, 50, 0, 0, 0, 1, 1);
this.CreateWeapon(4, 0, 1, 24, 2, 3, true, "Short Bow", 2, 3, 5, 30, 20, 0, 0, 20, 80, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 1, 1, 24, 2, 3, true, "Bow", 8, 9, 13, 30, 24, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 2, 1, 24, 2, 3, true, "Elven Bow", 16, 17, 24, 30, 28, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 3, 1, 24, 2, 3, true, "Battle Bow", 26, 28, 37, 30, 36, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 4, 1, 24, 2, 4, true, "Tiger Bow", 40, 42, 52, 30, 43, 0, 0, 30, 100, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 5, 1, 24, 2, 4, true, "Silver Bow", 56, 59, 71, 40, 48, 0, 0, 30, 100, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 6, 1, 24, 2, 4, false, "Chaos Nature Bow", 75, 88, 106, 35, 68, 0, 0, 40, 150, 0, 0, 0, 0, 1);
this.CreateAmmunition(4, 7, 1, 1, 2, false, "Bolt", 0, 255, 0, 0, 1);
this.CreateWeapon(4, 8, 0, 24, 2, 2, true, "Crossbow", 4, 5, 8, 40, 22, 0, 0, 20, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 9, 0, 24, 2, 2, true, "Golden Crossbow", 12, 13, 19, 40, 26, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 10, 0, 24, 2, 2, true, "Arquebus", 20, 22, 30, 40, 31, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 11, 0, 24, 2, 3, true, "Light Crossbow", 32, 35, 44, 40, 40, 0, 0, 30, 90, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 12, 0, 24, 2, 3, true, "Serpent Crossbow", 48, 50, 61, 40, 45, 0, 0, 30, 100, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 13, 0, 24, 2, 3, true, "Bluewing Crossbow", 68, 68, 82, 40, 56, 0, 0, 40, 110, 0, 0, 0, 0, 1);
this.CreateWeapon(4, 14, 0, 24, 2, 3, true, "Aquagold Crossbow", 72, 78, 92, 30, 60, 0, 0, 50, 130, 0, 0, 0, 0, 1);
this.CreateAmmunition(4, 15, 0, 1, 2, false, "Arrows", 0, 255, 0, 0, 1);
this.CreateWeapon(5, 0, 0, 0, 1, 3, true, "Skull Staff", 6, 3, 4, 20, 20, 6, 0, 40, 0, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 1, 0, 0, 2, 3, true, "Angelic Staff", 18, 10, 12, 25, 38, 20, 0, 50, 0, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 2, 0, 0, 2, 3, true, "Serpent Staff", 30, 17, 18, 25, 50, 34, 0, 50, 0, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 3, 0, 0, 2, 4, true, "Thunder Staff", 42, 23, 25, 25, 60, 46, 0, 40, 10, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 4, 0, 0, 2, 4, true, "Gorgon Staff", 52, 29, 32, 25, 65, 58, 0, 50, 0, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 5, 0, 0, 1, 4, true, "Legendary Staff", 59, 29, 31, 25, 66, 59, 0, 50, 0, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 6, 0, 0, 1, 4, true, "Staff of Resurrection", 70, 35, 39, 25, 70, 70, 0, 60, 10, 0, 0, 1, 0, 0);
this.CreateWeapon(5, 7, 0, 0, 2, 4, false, "Chaos Lightning Staff", 75, 47, 48, 30, 70, 94, 0, 60, 10, 0, 0, 1, 0, 0);
}
/// <summary>
/// Creates the ammunition.
/// </summary>
/// <param name="group">The group.</param>
/// <param name="number">The number.</param>
/// <param name="slot">The slot.</param>
/// <param name="width">The width.</param>
/// <param name="height">The height.</param>
/// <param name="dropsFromMonsters">if set to <c>true</c>, the item drops from monsters.</param>
/// <param name="name">The name.</param>
/// <param name="dropLevel">The drop level.</param>
/// <param name="durability">The durability.</param>
/// <param name="wizardClass">The wizard class.</param>
/// <param name="knightClass">The knight class.</param>
/// <param name="elfClass">The elf class.</param>
protected void CreateAmmunition(byte @group, byte number, byte slot, byte width, byte height, bool dropsFromMonsters, string name, byte dropLevel, byte durability, int wizardClass, int knightClass, int elfClass)
{
var item = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(item);
item.Name = name;
item.Group = group;
item.Number = number;
item.Height = height;
item.Width = width;
item.DropLevel = dropLevel;
item.MaximumItemLevel = 0;
item.DropsFromMonsters = dropsFromMonsters;
item.SetGuid(item.Group, item.Number);
if (slot == 0 && knightClass > 0 && width == 1)
{
item.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(t => t.ItemSlots.Contains(0) && t.ItemSlots.Contains(1));
}
else
{
item.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(t => t.ItemSlots.Contains(slot));
}
item.Durability = durability;
var qualifiedCharacterClasses = this.GameConfiguration.DetermineCharacterClasses(wizardClass == 1, knightClass == 1, elfClass == 1);
qualifiedCharacterClasses.ToList().ForEach(item.QualifiedCharacters.Add);
item.IsAmmunition = true;
}
/// <summary>
/// Creates the item with the specified parameters.
/// </summary>
/// <param name="group">The group number.</param>
/// <param name="number">The item number inside the group.</param>
/// <param name="slot">The slot.</param>
/// <param name="skillNumber">The skill number.</param>
/// <param name="width">The width.</param>
/// <param name="height">The height.</param>
/// <param name="dropsFromMonsters">if set to <c>true</c>, the item drops from monsters.</param>
/// <param name="name">The name.</param>
/// <param name="dropLevel">The drop level.</param>
/// <param name="minimumDamage">The minimum damage.</param>
/// <param name="maximumDamage">The maximum damage.</param>
/// <param name="attackSpeed">The attack speed.</param>
/// <param name="durability">The durability.</param>
/// <param name="magicPower">The magic power.</param>
/// <param name="levelRequirement">The level requirement.</param>
/// <param name="strengthRequirement">The strength requirement.</param>
/// <param name="agilityRequirement">The agility requirement.</param>
/// <param name="energyRequirement">The energy requirement.</param>
/// <param name="vitalityRequirement">The vitality requirement.</param>
/// <param name="wizardClass">The wizard class.</param>
/// <param name="knightClass">The knight class.</param>
/// <param name="elfClass">The elf class.</param>
/// <param name="isAmmunition">If set to <c>true</c>, the item is ammunition for a weapon.</param>
protected void CreateWeapon(
byte @group,
byte number,
byte slot,
int skillNumber,
byte width,
byte height,
bool dropsFromMonsters,
string name,
byte dropLevel,
int minimumDamage,
int maximumDamage,
int attackSpeed,
byte durability,
int magicPower,
int levelRequirement,
int strengthRequirement,
int agilityRequirement,
int energyRequirement,
int vitalityRequirement,
int wizardClass,
int knightClass,
int elfClass,
bool isAmmunition = false)
{
var item = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(item);
item.Name = name;
item.Group = group;
item.Number = number;
item.Height = height;
item.Width = width;
item.DropLevel = dropLevel;
item.MaximumItemLevel = isAmmunition ? (byte)0 : Constants.MaximumItemLevel;
item.DropsFromMonsters = dropsFromMonsters;
item.SetGuid(item.Group, item.Number);
if (slot == 0 && knightClass > 0 && width == 1)
{
item.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(t => t.ItemSlots.Contains(0) && t.ItemSlots.Contains(1));
}
else
{
item.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(t => t.ItemSlots.Contains(slot));
}
if (skillNumber > 0)
{
var itemSkill = this.GameConfiguration.Skills.First(s => s.Number == skillNumber);
item.Skill = itemSkill;
}
item.Durability = durability;
var qualifiedCharacterClasses = this.GameConfiguration.DetermineCharacterClasses(wizardClass == 1, knightClass == 1, elfClass == 1);
qualifiedCharacterClasses.ToList().ForEach(item.QualifiedCharacters.Add);
var minDamagePowerUp = this.CreateItemBasePowerUpDefinition(Stats.MinimumPhysBaseDmgByWeapon, minimumDamage, AggregateType.AddRaw);
minDamagePowerUp.BonusPerLevelTable = this._weaponDamageIncreaseTable;
item.BasePowerUpAttributes.Add(minDamagePowerUp);
var maxDamagePowerUp = this.CreateItemBasePowerUpDefinition(Stats.MaximumPhysBaseDmgByWeapon, maximumDamage, AggregateType.AddRaw);
maxDamagePowerUp.BonusPerLevelTable = this._weaponDamageIncreaseTable;
item.BasePowerUpAttributes.Add(maxDamagePowerUp);
var speedPowerUp = this.CreateItemBasePowerUpDefinition(Stats.AttackSpeedByWeapon, attackSpeed, AggregateType.AddRaw);
item.BasePowerUpAttributes.Add(speedPowerUp);
this.CreateItemRequirementIfNeeded(item, Stats.Level, levelRequirement);
this.CreateItemRequirementIfNeeded(item, Stats.TotalStrengthRequirementValue, strengthRequirement);
this.CreateItemRequirementIfNeeded(item, Stats.TotalAgilityRequirementValue, agilityRequirement);
this.CreateItemRequirementIfNeeded(item, Stats.TotalEnergyRequirementValue, energyRequirement);
this.CreateItemRequirementIfNeeded(item, Stats.TotalVitalityRequirementValue, vitalityRequirement);
item.PossibleItemOptions.Add(this.Luck);
if (magicPower == 0)
{
item.PossibleItemOptions.Add(this.PhysicalDamageOption);
}
else
{
item.PossibleItemOptions.Add(this.WizardryDamageOption);
var staffRisePowerUp = this.CreateItemBasePowerUpDefinition(Stats.StaffRise, magicPower / 2.0f, AggregateType.AddRaw);
staffRisePowerUp.BonusPerLevelTable = magicPower % 2 == 0 ? this._staffRiseTableEven : this._staffRiseTableOdd;
item.BasePowerUpAttributes.Add(staffRisePowerUp);
}
item.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.EquippedWeaponCount, 1, AggregateType.AddRaw));
if (group < (int)ItemGroups.Spears && width == 1)
{
item.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.DoubleWieldWeaponCount, 1, AggregateType.AddRaw));
}
if (group == (int)ItemGroups.Bows)
{
item.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.AmmunitionConsumptionRate, 1, AggregateType.AddRaw));
}
if (group < (int)ItemGroups.Bows && width == 2)
{
item.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.IsTwoHandedWeaponEquipped, 1, AggregateType.AddRaw));
}
}
}

View File

@@ -0,0 +1,126 @@
// <copyright file="Wings.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.Version075.Items;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
/// <summary>
/// Initializer for wing items.
/// </summary>
public class Wings : WingsInitializerBase
{
private ItemLevelBonusTable? _absorbByLevelTable;
private ItemLevelBonusTable? _defenseBonusByLevelTable;
private ItemLevelBonusTable? _damageIncreaseByLevelTable;
/// <summary>
/// Initializes a new instance of the <see cref="Wings"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Wings(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
protected override int MaximumItemLevel => Constants.MaximumItemLevel;
/// <summary>
/// Initializes all wings.
/// </summary>
public override void Initialize()
{
this._absorbByLevelTable = this.CreateAbsorbBonusPerLevel();
this._defenseBonusByLevelTable = this.CreateBonusDefensePerLevel();
this._damageIncreaseByLevelTable = this.CreateDamageIncreaseBonusPerLevelFirstAndThirdWings();
this.CreateWing(0, 3, 2, "Wings of Elf", 100, 10, 200, 180, 0, 0, 1, this.BuildOptions((0, OptionType.HealthRecover)), 12, 12);
this.CreateWing(1, 5, 3, "Wings of Heaven", 100, 10, 200, 180, 1, 0, 0, this.BuildOptions((0, OptionType.WizDamage)), 12, 12);
this.CreateWing(2, 5, 2, "Wings of Satan", 100, 20, 200, 180, 0, 1, 0, this.BuildOptions((0, OptionType.PhysDamage)), 12, 12);
}
private ItemDefinition CreateWing(byte number, byte width, byte height, string name, byte dropLevel, int defense, byte durability, int levelRequirement, int darkWizardClassLevel, int darkKnightClassLevel, int elfClassLevel, IEnumerable<IncreasableItemOption> possibleOptions, int damageIncreaseInitial, int damageAbsorbInitial)
{
var wing = this.CreateWing(number, width, height, name, dropLevel, defense, durability, levelRequirement, darkWizardClassLevel, darkKnightClassLevel, elfClassLevel);
if (damageAbsorbInitial > 0)
{
var powerUp = this.CreateItemBasePowerUpDefinition(Stats.DamageReceiveDecrement, 1f - (damageAbsorbInitial / 100f), AggregateType.Multiplicate);
powerUp.BonusPerLevelTable = this._absorbByLevelTable;
wing.BasePowerUpAttributes.Add(powerUp);
}
if (damageIncreaseInitial > 0)
{
var powerUp = this.CreateItemBasePowerUpDefinition(Stats.AttackDamageIncrease, 1f + (damageIncreaseInitial / 100f), AggregateType.Multiplicate);
powerUp.BonusPerLevelTable = this._damageIncreaseByLevelTable;
wing.BasePowerUpAttributes.Add(powerUp);
}
var optionDefinition = this.Context.CreateNew<ItemOptionDefinition>();
this.GameConfiguration.ItemOptions.Add(optionDefinition);
optionDefinition.Name = $"{name} Options";
optionDefinition.AddChance = 0.25f;
optionDefinition.AddsRandomly = true;
optionDefinition.MaximumOptionsPerItem = 1;
wing.PossibleItemOptions.Add(optionDefinition);
foreach (var option in possibleOptions)
{
optionDefinition.PossibleOptions.Add(option);
}
wing.PossibleItemOptions.Add(this.GameConfiguration.ItemOptions.First(iod => iod.PossibleOptions.Any(o => o?.OptionType == ItemOptionTypes.Luck)));
return wing;
}
private ItemDefinition CreateWing(byte number, byte width, byte height, string name, byte dropLevel, int defense, byte durability, int levelRequirement, int darkWizardClassLevel, int darkKnightClassLevel, int elfClassLevel)
{
var wing = this.Context.CreateNew<ItemDefinition>();
this.GameConfiguration.Items.Add(wing);
wing.Group = 12;
wing.Number = number;
wing.Width = width;
wing.Height = height;
wing.Name = name;
wing.DropLevel = dropLevel;
wing.MaximumItemLevel = Constants.MaximumItemLevel;
wing.DropsFromMonsters = false;
wing.Durability = durability;
wing.ItemSlot = this.GameConfiguration.ItemSlotTypes.First(st => st.ItemSlots.Contains(7));
wing.SetGuid(wing.Group, wing.Number);
//// TODO: each level increases the requirement by 5 Levels
this.CreateItemRequirementIfNeeded(wing, Stats.Level, levelRequirement);
if (defense > 0)
{
var powerUp = this.CreateItemBasePowerUpDefinition(Stats.DefenseBase, defense, AggregateType.AddRaw);
wing.BasePowerUpAttributes.Add(powerUp);
powerUp.BonusPerLevelTable = this._defenseBonusByLevelTable;
}
var classes = this.GameConfiguration.DetermineCharacterClasses(darkWizardClassLevel == 1, darkKnightClassLevel == 1, elfClassLevel == 1);
foreach (var characterClass in classes)
{
wing.QualifiedCharacters.Add(characterClass);
}
// add CanFly Attribute to all wings
var canFlyPowerUp = this.Context.CreateNew<ItemBasePowerUpDefinition>();
canFlyPowerUp.TargetAttribute = Stats.CanFly.GetPersistent(this.GameConfiguration);
canFlyPowerUp.BaseValue = 1;
wing.BasePowerUpAttributes.Add(canFlyPowerUp);
wing.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.MovementSpeed, MovementSpeedConstants.DefaultWingMovementSpeed, AggregateType.Maximum));
wing.BasePowerUpAttributes.Add(this.CreateItemBasePowerUpDefinition(Stats.MovementSpeedUnderwater, MovementSpeedConstants.DefaultWingMovementSpeed, AggregateType.Maximum));
return wing;
}
}

View File

@@ -0,0 +1,80 @@
// <copyright file="Arena.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.Version075.Maps;
using MUnique.OpenMU.DataModel.Configuration;
/// <summary>
/// Initialization for the Arena map.
/// </summary>
internal class Arena : Initialization.BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 6;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Arena";
/// <summary>
/// Initializes a new instance of the <see cref="Arena"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Arena(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[240], 58, 58, 140, 140, 1, Direction.SouthWest);
yield return this.CreateMonsterSpawn(2, this.NpcDictionary[200], 62, 62, 160, 160, 1, Direction.SouthWest);
yield return this.CreateMonsterSpawn(3, this.NpcDictionary[239], 67, 67, 140, 140, 1, Direction.SouthWest);
}
/// <inheritdoc/>
protected override void AdditionalInitialization(GameMapDefinition mapDefinition)
{
var battleZone = this.Context.CreateNew<BattleZoneDefinition>();
battleZone.SetGuid(this.MapNumber, 1);
battleZone.Type = BattleType.Soccer;
battleZone.LeftTeamSpawnPointX = 60;
battleZone.LeftTeamSpawnPointY = 156;
battleZone.RightTeamSpawnPointX = 60;
battleZone.RightTeamSpawnPointY = 164;
battleZone.Ground = this.CreateRectangle(1, 55, 141, 69, 180);
battleZone.LeftGoal = this.CreateRectangle(2, 61, 139, 63, 140);
battleZone.RightGoal = this.CreateRectangle(3, 61, 181, 63, 182);
mapDefinition.BattleZone = battleZone;
}
/// <inheritdoc/>
protected override void CreateMonsters()
{
// no monsters to create
}
private Rectangle CreateRectangle(short number, byte x1, byte y1, byte x2, byte y2)
{
var rectangle = this.Context.CreateNew<Rectangle>();
rectangle.SetGuid(this.MapNumber, number);
rectangle.X1 = x1;
rectangle.X2 = x2;
rectangle.Y1 = y1;
rectangle.Y2 = y2;
return rectangle;
}
}

View File

@@ -0,0 +1,662 @@
// <copyright file="Atlans.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.Version075.Maps;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// Initialization for the Atlans map.
/// </summary>
internal class Atlans : BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 7;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Atlans";
/// <summary>
/// Initializes a new instance of the <see cref="Atlans"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Atlans(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc />
protected override void AdditionalInitialization(GameMapDefinition mapDefinition)
{
base.AdditionalInitialization(mapDefinition);
this.AddUnderwaterMovementPowerUp();
}
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[240], 23, 17, Direction.SouthWest); // Guard
}
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateMonsterSpawns()
{
yield return this.CreateMonsterSpawn(100, this.NpcDictionary[48], 236, 177);
yield return this.CreateMonsterSpawn(101, this.NpcDictionary[51], 212, 96);
yield return this.CreateMonsterSpawn(102, this.NpcDictionary[45], 21, 41);
yield return this.CreateMonsterSpawn(103, this.NpcDictionary[45], 23, 33);
yield return this.CreateMonsterSpawn(104, this.NpcDictionary[45], 31, 31);
yield return this.CreateMonsterSpawn(105, this.NpcDictionary[45], 39, 23);
yield return this.CreateMonsterSpawn(106, this.NpcDictionary[45], 41, 11);
yield return this.CreateMonsterSpawn(107, this.NpcDictionary[45], 21, 48);
yield return this.CreateMonsterSpawn(108, this.NpcDictionary[45], 47, 41);
yield return this.CreateMonsterSpawn(109, this.NpcDictionary[45], 39, 63);
yield return this.CreateMonsterSpawn(110, this.NpcDictionary[45], 72, 42);
yield return this.CreateMonsterSpawn(111, this.NpcDictionary[45], 23, 56);
yield return this.CreateMonsterSpawn(112, this.NpcDictionary[45], 23, 64);
yield return this.CreateMonsterSpawn(113, this.NpcDictionary[45], 35, 70);
yield return this.CreateMonsterSpawn(114, this.NpcDictionary[45], 29, 75);
yield return this.CreateMonsterSpawn(115, this.NpcDictionary[45], 62, 21);
yield return this.CreateMonsterSpawn(116, this.NpcDictionary[45], 78, 19);
yield return this.CreateMonsterSpawn(117, this.NpcDictionary[45], 67, 36);
yield return this.CreateMonsterSpawn(118, this.NpcDictionary[45], 24, 86);
yield return this.CreateMonsterSpawn(119, this.NpcDictionary[45], 48, 57);
yield return this.CreateMonsterSpawn(120, this.NpcDictionary[45], 45, 70);
yield return this.CreateMonsterSpawn(121, this.NpcDictionary[45], 19, 125);
yield return this.CreateMonsterSpawn(122, this.NpcDictionary[45], 49, 8);
yield return this.CreateMonsterSpawn(123, this.NpcDictionary[45], 46, 20);
yield return this.CreateMonsterSpawn(124, this.NpcDictionary[45], 39, 35);
yield return this.CreateMonsterSpawn(125, this.NpcDictionary[45], 37, 50);
yield return this.CreateMonsterSpawn(126, this.NpcDictionary[45], 20, 75);
yield return this.CreateMonsterSpawn(127, this.NpcDictionary[45], 63, 44);
yield return this.CreateMonsterSpawn(128, this.NpcDictionary[45], 68, 52);
yield return this.CreateMonsterSpawn(129, this.NpcDictionary[45], 49, 64);
yield return this.CreateMonsterSpawn(130, this.NpcDictionary[45], 29, 52);
yield return this.CreateMonsterSpawn(131, this.NpcDictionary[46], 46, 21);
yield return this.CreateMonsterSpawn(132, this.NpcDictionary[46], 48, 9);
yield return this.CreateMonsterSpawn(133, this.NpcDictionary[46], 50, 65);
yield return this.CreateMonsterSpawn(134, this.NpcDictionary[46], 51, 70);
yield return this.CreateMonsterSpawn(135, this.NpcDictionary[46], 80, 33);
yield return this.CreateMonsterSpawn(136, this.NpcDictionary[46], 62, 17);
yield return this.CreateMonsterSpawn(137, this.NpcDictionary[46], 61, 11);
yield return this.CreateMonsterSpawn(138, this.NpcDictionary[46], 69, 19);
yield return this.CreateMonsterSpawn(139, this.NpcDictionary[46], 75, 15);
yield return this.CreateMonsterSpawn(140, this.NpcDictionary[46], 83, 15);
yield return this.CreateMonsterSpawn(141, this.NpcDictionary[46], 84, 21);
yield return this.CreateMonsterSpawn(142, this.NpcDictionary[46], 67, 27);
yield return this.CreateMonsterSpawn(143, this.NpcDictionary[46], 59, 34);
yield return this.CreateMonsterSpawn(144, this.NpcDictionary[46], 86, 37);
yield return this.CreateMonsterSpawn(145, this.NpcDictionary[46], 78, 44);
yield return this.CreateMonsterSpawn(146, this.NpcDictionary[46], 71, 52);
yield return this.CreateMonsterSpawn(147, this.NpcDictionary[46], 65, 59);
yield return this.CreateMonsterSpawn(148, this.NpcDictionary[46], 65, 51);
yield return this.CreateMonsterSpawn(149, this.NpcDictionary[46], 55, 44);
yield return this.CreateMonsterSpawn(150, this.NpcDictionary[46], 40, 48);
yield return this.CreateMonsterSpawn(151, this.NpcDictionary[46], 31, 53);
yield return this.CreateMonsterSpawn(152, this.NpcDictionary[46], 24, 90);
yield return this.CreateMonsterSpawn(153, this.NpcDictionary[46], 21, 100);
yield return this.CreateMonsterSpawn(154, this.NpcDictionary[46], 25, 105);
yield return this.CreateMonsterSpawn(155, this.NpcDictionary[46], 30, 110);
yield return this.CreateMonsterSpawn(156, this.NpcDictionary[46], 21, 118);
yield return this.CreateMonsterSpawn(157, this.NpcDictionary[46], 38, 117);
yield return this.CreateMonsterSpawn(158, this.NpcDictionary[46], 141, 11);
yield return this.CreateMonsterSpawn(159, this.NpcDictionary[46], 127, 17);
yield return this.CreateMonsterSpawn(160, this.NpcDictionary[46], 114, 26);
yield return this.CreateMonsterSpawn(161, this.NpcDictionary[46], 107, 18);
yield return this.CreateMonsterSpawn(162, this.NpcDictionary[46], 104, 13);
yield return this.CreateMonsterSpawn(163, this.NpcDictionary[46], 115, 12);
yield return this.CreateMonsterSpawn(164, this.NpcDictionary[46], 89, 62);
yield return this.CreateMonsterSpawn(165, this.NpcDictionary[46], 75, 76);
yield return this.CreateMonsterSpawn(166, this.NpcDictionary[46], 69, 87);
yield return this.CreateMonsterSpawn(167, this.NpcDictionary[46], 50, 93);
yield return this.CreateMonsterSpawn(168, this.NpcDictionary[46], 23, 72);
yield return this.CreateMonsterSpawn(169, this.NpcDictionary[46], 78, 23);
yield return this.CreateMonsterSpawn(170, this.NpcDictionary[46], 70, 38);
yield return this.CreateMonsterSpawn(171, this.NpcDictionary[46], 55, 25);
yield return this.CreateMonsterSpawn(172, this.NpcDictionary[46], 30, 122);
yield return this.CreateMonsterSpawn(173, this.NpcDictionary[46], 17, 126);
yield return this.CreateMonsterSpawn(174, this.NpcDictionary[46], 122, 29);
yield return this.CreateMonsterSpawn(175, this.NpcDictionary[46], 108, 40);
yield return this.CreateMonsterSpawn(176, this.NpcDictionary[48], 66, 222);
yield return this.CreateMonsterSpawn(177, this.NpcDictionary[48], 63, 218);
yield return this.CreateMonsterSpawn(178, this.NpcDictionary[48], 57, 225);
yield return this.CreateMonsterSpawn(179, this.NpcDictionary[48], 171, 162);
yield return this.CreateMonsterSpawn(180, this.NpcDictionary[48], 175, 169);
yield return this.CreateMonsterSpawn(181, this.NpcDictionary[48], 178, 174);
yield return this.CreateMonsterSpawn(182, this.NpcDictionary[48], 173, 179);
yield return this.CreateMonsterSpawn(183, this.NpcDictionary[48], 171, 187);
yield return this.CreateMonsterSpawn(184, this.NpcDictionary[48], 165, 193);
yield return this.CreateMonsterSpawn(185, this.NpcDictionary[48], 159, 198);
yield return this.CreateMonsterSpawn(186, this.NpcDictionary[48], 152, 201);
yield return this.CreateMonsterSpawn(187, this.NpcDictionary[48], 144, 201);
yield return this.CreateMonsterSpawn(188, this.NpcDictionary[48], 137, 205);
yield return this.CreateMonsterSpawn(189, this.NpcDictionary[48], 124, 206);
yield return this.CreateMonsterSpawn(190, this.NpcDictionary[48], 115, 210);
yield return this.CreateMonsterSpawn(191, this.NpcDictionary[48], 104, 211);
yield return this.CreateMonsterSpawn(192, this.NpcDictionary[48], 94, 210);
yield return this.CreateMonsterSpawn(193, this.NpcDictionary[48], 87, 214);
yield return this.CreateMonsterSpawn(194, this.NpcDictionary[48], 76, 215);
yield return this.CreateMonsterSpawn(195, this.NpcDictionary[48], 47, 224);
yield return this.CreateMonsterSpawn(196, this.NpcDictionary[48], 46, 217);
yield return this.CreateMonsterSpawn(197, this.NpcDictionary[48], 29, 226);
yield return this.CreateMonsterSpawn(198, this.NpcDictionary[48], 22, 213);
yield return this.CreateMonsterSpawn(199, this.NpcDictionary[48], 24, 204);
yield return this.CreateMonsterSpawn(200, this.NpcDictionary[48], 34, 200);
yield return this.CreateMonsterSpawn(201, this.NpcDictionary[48], 35, 209);
yield return this.CreateMonsterSpawn(202, this.NpcDictionary[48], 40, 210);
yield return this.CreateMonsterSpawn(203, this.NpcDictionary[48], 45, 205);
yield return this.CreateMonsterSpawn(204, this.NpcDictionary[48], 47, 211);
yield return this.CreateMonsterSpawn(205, this.NpcDictionary[48], 37, 232);
yield return this.CreateMonsterSpawn(206, this.NpcDictionary[48], 226, 52);
yield return this.CreateMonsterSpawn(207, this.NpcDictionary[48], 22, 230);
yield return this.CreateMonsterSpawn(208, this.NpcDictionary[48], 41, 224);
yield return this.CreateMonsterSpawn(209, this.NpcDictionary[48], 82, 215);
yield return this.CreateMonsterSpawn(210, this.NpcDictionary[48], 167, 156);
yield return this.CreateMonsterSpawn(211, this.NpcDictionary[48], 177, 146);
yield return this.CreateMonsterSpawn(212, this.NpcDictionary[52], 156, 156);
yield return this.CreateMonsterSpawn(213, this.NpcDictionary[52], 162, 149);
yield return this.CreateMonsterSpawn(214, this.NpcDictionary[52], 152, 169);
yield return this.CreateMonsterSpawn(215, this.NpcDictionary[52], 72, 128);
yield return this.CreateMonsterSpawn(216, this.NpcDictionary[52], 70, 138);
yield return this.CreateMonsterSpawn(217, this.NpcDictionary[52], 61, 147);
yield return this.CreateMonsterSpawn(218, this.NpcDictionary[52], 49, 158);
yield return this.CreateMonsterSpawn(219, this.NpcDictionary[52], 33, 169);
yield return this.CreateMonsterSpawn(220, this.NpcDictionary[52], 22, 173);
yield return this.CreateMonsterSpawn(221, this.NpcDictionary[52], 55, 181);
yield return this.CreateMonsterSpawn(222, this.NpcDictionary[52], 67, 186);
yield return this.CreateMonsterSpawn(223, this.NpcDictionary[52], 73, 180);
yield return this.CreateMonsterSpawn(224, this.NpcDictionary[52], 89, 184);
yield return this.CreateMonsterSpawn(225, this.NpcDictionary[52], 101, 183);
yield return this.CreateMonsterSpawn(226, this.NpcDictionary[52], 111, 183);
yield return this.CreateMonsterSpawn(227, this.NpcDictionary[52], 122, 178);
yield return this.CreateMonsterSpawn(228, this.NpcDictionary[52], 129, 171);
yield return this.CreateMonsterSpawn(229, this.NpcDictionary[52], 138, 167);
yield return this.CreateMonsterSpawn(230, this.NpcDictionary[52], 147, 164);
yield return this.CreateMonsterSpawn(231, this.NpcDictionary[52], 170, 145);
yield return this.CreateMonsterSpawn(232, this.NpcDictionary[52], 167, 140);
yield return this.CreateMonsterSpawn(233, this.NpcDictionary[52], 53, 220);
yield return this.CreateMonsterSpawn(234, this.NpcDictionary[52], 41, 222);
yield return this.CreateMonsterSpawn(235, this.NpcDictionary[52], 29, 231);
yield return this.CreateMonsterSpawn(236, this.NpcDictionary[52], 22, 232);
yield return this.CreateMonsterSpawn(237, this.NpcDictionary[52], 27, 209);
yield return this.CreateMonsterSpawn(238, this.NpcDictionary[52], 36, 205);
yield return this.CreateMonsterSpawn(239, this.NpcDictionary[52], 109, 211);
yield return this.CreateMonsterSpawn(240, this.NpcDictionary[52], 131, 207);
yield return this.CreateMonsterSpawn(241, this.NpcDictionary[52], 155, 196);
yield return this.CreateMonsterSpawn(242, this.NpcDictionary[52], 167, 154);
yield return this.CreateMonsterSpawn(243, this.NpcDictionary[52], 177, 19);
yield return this.CreateMonsterSpawn(244, this.NpcDictionary[52], 118, 167);
yield return this.CreateMonsterSpawn(245, this.NpcDictionary[52], 111, 175);
yield return this.CreateMonsterSpawn(246, this.NpcDictionary[52], 63, 178);
yield return this.CreateMonsterSpawn(247, this.NpcDictionary[52], 162, 141);
yield return this.CreateMonsterSpawn(248, this.NpcDictionary[52], 138, 176);
yield return this.CreateMonsterSpawn(249, this.NpcDictionary[47], 41, 109);
yield return this.CreateMonsterSpawn(250, this.NpcDictionary[47], 49, 100);
yield return this.CreateMonsterSpawn(251, this.NpcDictionary[47], 54, 89);
yield return this.CreateMonsterSpawn(252, this.NpcDictionary[47], 62, 87);
yield return this.CreateMonsterSpawn(253, this.NpcDictionary[47], 71, 82);
yield return this.CreateMonsterSpawn(254, this.NpcDictionary[47], 79, 70);
yield return this.CreateMonsterSpawn(255, this.NpcDictionary[47], 85, 64);
yield return this.CreateMonsterSpawn(256, this.NpcDictionary[47], 94, 60);
yield return this.CreateMonsterSpawn(257, this.NpcDictionary[47], 101, 50);
yield return this.CreateMonsterSpawn(258, this.NpcDictionary[47], 106, 48);
yield return this.CreateMonsterSpawn(259, this.NpcDictionary[47], 112, 45);
yield return this.CreateMonsterSpawn(260, this.NpcDictionary[47], 109, 38);
yield return this.CreateMonsterSpawn(261, this.NpcDictionary[47], 118, 37);
yield return this.CreateMonsterSpawn(262, this.NpcDictionary[47], 122, 29);
yield return this.CreateMonsterSpawn(263, this.NpcDictionary[47], 119, 20);
yield return this.CreateMonsterSpawn(264, this.NpcDictionary[47], 124, 14);
yield return this.CreateMonsterSpawn(265, this.NpcDictionary[47], 133, 14);
yield return this.CreateMonsterSpawn(266, this.NpcDictionary[47], 150, 14);
yield return this.CreateMonsterSpawn(267, this.NpcDictionary[47], 161, 11);
yield return this.CreateMonsterSpawn(268, this.NpcDictionary[47], 166, 16);
yield return this.CreateMonsterSpawn(269, this.NpcDictionary[47], 171, 18);
yield return this.CreateMonsterSpawn(270, this.NpcDictionary[47], 182, 14);
yield return this.CreateMonsterSpawn(271, this.NpcDictionary[47], 190, 24);
yield return this.CreateMonsterSpawn(272, this.NpcDictionary[47], 196, 27);
yield return this.CreateMonsterSpawn(273, this.NpcDictionary[47], 200, 17);
yield return this.CreateMonsterSpawn(274, this.NpcDictionary[47], 208, 9);
yield return this.CreateMonsterSpawn(275, this.NpcDictionary[47], 222, 48);
yield return this.CreateMonsterSpawn(276, this.NpcDictionary[47], 222, 14);
yield return this.CreateMonsterSpawn(277, this.NpcDictionary[47], 117, 74);
yield return this.CreateMonsterSpawn(278, this.NpcDictionary[47], 139, 61);
yield return this.CreateMonsterSpawn(279, this.NpcDictionary[47], 152, 61);
yield return this.CreateMonsterSpawn(280, this.NpcDictionary[47], 172, 55);
yield return this.CreateMonsterSpawn(281, this.NpcDictionary[47], 189, 56);
yield return this.CreateMonsterSpawn(282, this.NpcDictionary[47], 226, 46);
yield return this.CreateMonsterSpawn(283, this.NpcDictionary[47], 240, 11);
yield return this.CreateMonsterSpawn(284, this.NpcDictionary[47], 227, 16);
yield return this.CreateMonsterSpawn(285, this.NpcDictionary[47], 152, 22);
yield return this.CreateMonsterSpawn(286, this.NpcDictionary[47], 142, 15);
yield return this.CreateMonsterSpawn(287, this.NpcDictionary[47], 128, 22);
yield return this.CreateMonsterSpawn(288, this.NpcDictionary[47], 116, 9);
yield return this.CreateMonsterSpawn(289, this.NpcDictionary[47], 113, 27);
yield return this.CreateMonsterSpawn(290, this.NpcDictionary[47], 33, 108);
yield return this.CreateMonsterSpawn(291, this.NpcDictionary[47], 35, 118);
yield return this.CreateMonsterSpawn(292, this.NpcDictionary[51], 228, 16);
yield return this.CreateMonsterSpawn(293, this.NpcDictionary[51], 237, 17);
yield return this.CreateMonsterSpawn(294, this.NpcDictionary[51], 237, 26);
yield return this.CreateMonsterSpawn(295, this.NpcDictionary[51], 238, 40);
yield return this.CreateMonsterSpawn(296, this.NpcDictionary[51], 235, 48);
yield return this.CreateMonsterSpawn(297, this.NpcDictionary[51], 240, 51);
yield return this.CreateMonsterSpawn(298, this.NpcDictionary[51], 206, 55);
yield return this.CreateMonsterSpawn(299, this.NpcDictionary[51], 200, 49);
yield return this.CreateMonsterSpawn(300, this.NpcDictionary[51], 193, 52);
yield return this.CreateMonsterSpawn(301, this.NpcDictionary[51], 184, 52);
yield return this.CreateMonsterSpawn(302, this.NpcDictionary[51], 178, 58);
yield return this.CreateMonsterSpawn(303, this.NpcDictionary[51], 170, 61);
yield return this.CreateMonsterSpawn(304, this.NpcDictionary[51], 156, 59);
yield return this.CreateMonsterSpawn(305, this.NpcDictionary[51], 144, 63);
yield return this.CreateMonsterSpawn(306, this.NpcDictionary[51], 133, 61);
yield return this.CreateMonsterSpawn(307, this.NpcDictionary[51], 133, 70);
yield return this.CreateMonsterSpawn(308, this.NpcDictionary[51], 125, 78);
yield return this.CreateMonsterSpawn(309, this.NpcDictionary[51], 118, 85);
yield return this.CreateMonsterSpawn(310, this.NpcDictionary[51], 124, 90);
yield return this.CreateMonsterSpawn(311, this.NpcDictionary[51], 116, 98);
yield return this.CreateMonsterSpawn(312, this.NpcDictionary[51], 106, 101);
yield return this.CreateMonsterSpawn(313, this.NpcDictionary[51], 99, 108);
yield return this.CreateMonsterSpawn(314, this.NpcDictionary[51], 91, 115);
yield return this.CreateMonsterSpawn(315, this.NpcDictionary[51], 81, 123);
yield return this.CreateMonsterSpawn(316, this.NpcDictionary[51], 126, 167);
yield return this.CreateMonsterSpawn(317, this.NpcDictionary[51], 111, 174);
yield return this.CreateMonsterSpawn(318, this.NpcDictionary[51], 90, 177);
yield return this.CreateMonsterSpawn(319, this.NpcDictionary[51], 76, 180);
yield return this.CreateMonsterSpawn(320, this.NpcDictionary[51], 62, 178);
yield return this.CreateMonsterSpawn(321, this.NpcDictionary[51], 42, 178);
yield return this.CreateMonsterSpawn(322, this.NpcDictionary[51], 27, 161);
yield return this.CreateMonsterSpawn(323, this.NpcDictionary[51], 42, 152);
yield return this.CreateMonsterSpawn(324, this.NpcDictionary[51], 19, 159);
yield return this.CreateMonsterSpawn(325, this.NpcDictionary[51], 62, 140);
yield return this.CreateMonsterSpawn(326, this.NpcDictionary[51], 70, 133);
yield return this.CreateMonsterSpawn(327, this.NpcDictionary[51], 168, 54);
// yield return this.CreateMonsterSpawn(this2NpcDictionary[51], 7, 52);
yield return this.CreateMonsterSpawn(330, this.NpcDictionary[51], 225, 45);
yield return this.CreateMonsterSpawn(331, this.NpcDictionary[51], 207, 9);
yield return this.CreateMonsterSpawn(332, this.NpcDictionary[51], 154, 69);
yield return this.CreateMonsterSpawn(333, this.NpcDictionary[51], 111, 82);
yield return this.CreateMonsterSpawn(334, this.NpcDictionary[51], 81, 116);
yield return this.CreateMonsterSpawn(335, this.NpcDictionary[51], 72, 125);
yield return this.CreateMonsterSpawn(336, this.NpcDictionary[51], 122, 66);
yield return this.CreateMonsterSpawn(337, this.NpcDictionary[49], 19, 230);
yield return this.CreateMonsterSpawn(338, this.NpcDictionary[49], 24, 227);
yield return this.CreateMonsterSpawn(339, this.NpcDictionary[51], 219, 56);
yield return this.CreateMonsterSpawn(340, this.NpcDictionary[51], 215, 65);
yield return this.CreateMonsterSpawn(341, this.NpcDictionary[51], 232, 55);
yield return this.CreateMonsterSpawn(342, this.NpcDictionary[51], 231, 64);
yield return this.CreateMonsterSpawn(343, this.NpcDictionary[51], 238, 71);
yield return this.CreateMonsterSpawn(344, this.NpcDictionary[51], 229, 74);
yield return this.CreateMonsterSpawn(345, this.NpcDictionary[51], 217, 75);
yield return this.CreateMonsterSpawn(346, this.NpcDictionary[51], 225, 81);
yield return this.CreateMonsterSpawn(347, this.NpcDictionary[51], 215, 86);
yield return this.CreateMonsterSpawn(348, this.NpcDictionary[51], 223, 89);
yield return this.CreateMonsterSpawn(349, this.NpcDictionary[51], 218, 101);
yield return this.CreateMonsterSpawn(350, this.NpcDictionary[51], 232, 95);
yield return this.CreateMonsterSpawn(351, this.NpcDictionary[52], 223, 70);
yield return this.CreateMonsterSpawn(352, this.NpcDictionary[52], 211, 59);
yield return this.CreateMonsterSpawn(353, this.NpcDictionary[52], 232, 86);
yield return this.CreateMonsterSpawn(354, this.NpcDictionary[52], 208, 104);
yield return this.CreateMonsterSpawn(355, this.NpcDictionary[52], 235, 106);
yield return this.CreateMonsterSpawn(356, this.NpcDictionary[52], 224, 108);
yield return this.CreateMonsterSpawn(357, this.NpcDictionary[48], 219, 124);
yield return this.CreateMonsterSpawn(358, this.NpcDictionary[51], 225, 117);
yield return this.CreateMonsterSpawn(359, this.NpcDictionary[48], 227, 123);
yield return this.CreateMonsterSpawn(360, this.NpcDictionary[48], 219, 133);
yield return this.CreateMonsterSpawn(361, this.NpcDictionary[48], 226, 134);
yield return this.CreateMonsterSpawn(362, this.NpcDictionary[52], 224, 142);
yield return this.CreateMonsterSpawn(363, this.NpcDictionary[48], 226, 154);
yield return this.CreateMonsterSpawn(364, this.NpcDictionary[48], 221, 150);
yield return this.CreateMonsterSpawn(365, this.NpcDictionary[48], 220, 168);
yield return this.CreateMonsterSpawn(366, this.NpcDictionary[48], 232, 166);
yield return this.CreateMonsterSpawn(367, this.NpcDictionary[48], 231, 176);
yield return this.CreateMonsterSpawn(368, this.NpcDictionary[48], 217, 197);
yield return this.CreateMonsterSpawn(369, this.NpcDictionary[48], 215, 182);
yield return this.CreateMonsterSpawn(370, this.NpcDictionary[49], 211, 192);
yield return this.CreateMonsterSpawn(371, this.NpcDictionary[49], 229, 203);
yield return this.CreateMonsterSpawn(372, this.NpcDictionary[52], 208, 183);
yield return this.CreateMonsterSpawn(373, this.NpcDictionary[52], 215, 174);
yield return this.CreateMonsterSpawn(374, this.NpcDictionary[48], 222, 190);
yield return this.CreateMonsterSpawn(375, this.NpcDictionary[48], 229, 190);
yield return this.CreateMonsterSpawn(376, this.NpcDictionary[52], 230, 181);
yield return this.CreateMonsterSpawn(377, this.NpcDictionary[52], 226, 161);
yield return this.CreateMonsterSpawn(378, this.NpcDictionary[52], 208, 198);
yield return this.CreateMonsterSpawn(379, this.NpcDictionary[48], 232, 206);
yield return this.CreateMonsterSpawn(380, this.NpcDictionary[48], 231, 196);
yield return this.CreateMonsterSpawn(381, this.NpcDictionary[48], 223, 202);
yield return this.CreateMonsterSpawn(382, this.NpcDictionary[48], 224, 184);
yield return this.CreateMonsterSpawn(383, this.NpcDictionary[48], 230, 171);
yield return this.CreateMonsterSpawn(384, this.NpcDictionary[48], 221, 158);
yield return this.CreateMonsterSpawn(385, this.NpcDictionary[48], 233, 124);
yield return this.CreateMonsterSpawn(386, this.NpcDictionary[48], 232, 102);
yield return this.CreateMonsterSpawn(387, this.NpcDictionary[52], 200, 103);
yield return this.CreateMonsterSpawn(388, this.NpcDictionary[52], 192, 101);
yield return this.CreateMonsterSpawn(389, this.NpcDictionary[52], 179, 92);
yield return this.CreateMonsterSpawn(390, this.NpcDictionary[52], 187, 94);
yield return this.CreateMonsterSpawn(391, this.NpcDictionary[52], 177, 101);
yield return this.CreateMonsterSpawn(392, this.NpcDictionary[52], 166, 117);
yield return this.CreateMonsterSpawn(393, this.NpcDictionary[52], 159, 112);
yield return this.CreateMonsterSpawn(394, this.NpcDictionary[52], 156, 122);
yield return this.CreateMonsterSpawn(395, this.NpcDictionary[52], 173, 109);
yield return this.CreateMonsterSpawn(396, this.NpcDictionary[52], 167, 107);
yield return this.CreateMonsterSpawn(397, this.NpcDictionary[52], 150, 120);
yield return this.CreateMonsterSpawn(398, this.NpcDictionary[52], 142, 125);
yield return this.CreateMonsterSpawn(399, this.NpcDictionary[51], 136, 129);
yield return this.CreateMonsterSpawn(400, this.NpcDictionary[52], 129, 130);
yield return this.CreateMonsterSpawn(401, this.NpcDictionary[52], 117, 130);
yield return this.CreateMonsterSpawn(402, this.NpcDictionary[52], 121, 135);
yield return this.CreateMonsterSpawn(403, this.NpcDictionary[52], 144, 109);
yield return this.CreateMonsterSpawn(404, this.NpcDictionary[52], 122, 144);
yield return this.CreateMonsterSpawn(405, this.NpcDictionary[52], 112, 137);
yield return this.CreateMonsterSpawn(406, this.NpcDictionary[52], 101, 147);
yield return this.CreateMonsterSpawn(407, this.NpcDictionary[52], 97, 142);
yield return this.CreateMonsterSpawn(408, this.NpcDictionary[52], 144, 132);
yield return this.CreateMonsterSpawn(409, this.NpcDictionary[52], 93, 136);
yield return this.CreateMonsterSpawn(410, this.NpcDictionary[52], 90, 148);
yield return this.CreateMonsterSpawn(411, this.NpcDictionary[52], 124, 125);
yield return this.CreateMonsterSpawn(412, this.NpcDictionary[52], 87, 132);
yield return this.CreateMonsterSpawn(413, this.NpcDictionary[52], 86, 140);
yield return this.CreateMonsterSpawn(414, this.NpcDictionary[52], 78, 145);
yield return this.CreateMonsterSpawn(415, this.NpcDictionary[52], 79, 136);
yield return this.CreateMonsterSpawn(416, this.NpcDictionary[52], 67, 147);
yield return this.CreateMonsterSpawn(417, this.NpcDictionary[52], 71, 140);
yield return this.CreateMonsterSpawn(418, this.NpcDictionary[52], 105, 137);
yield return this.CreateMonsterSpawn(419, this.NpcDictionary[51], 83, 155);
yield return this.CreateMonsterSpawn(420, this.NpcDictionary[52], 81, 164);
yield return this.CreateMonsterSpawn(421, this.NpcDictionary[52], 70, 168);
yield return this.CreateMonsterSpawn(422, this.NpcDictionary[52], 76, 174);
yield return this.CreateMonsterSpawn(423, this.NpcDictionary[52], 85, 185);
yield return this.CreateMonsterSpawn(424, this.NpcDictionary[52], 87, 175);
yield return this.CreateMonsterSpawn(425, this.NpcDictionary[51], 65, 187);
yield return this.CreateMonsterSpawn(426, this.NpcDictionary[51], 64, 159);
yield return this.CreateMonsterSpawn(427, this.NpcDictionary[51], 186, 99);
yield return this.CreateMonsterSpawn(428, this.NpcDictionary[51], 185, 90);
yield return this.CreateMonsterSpawn(429, this.NpcDictionary[51], 147, 114);
yield return this.CreateMonsterSpawn(430, this.NpcDictionary[51], 84, 170);
yield return this.CreateMonsterSpawn(431, this.NpcDictionary[48], 15, 234);
yield return this.CreateMonsterSpawn(432, this.NpcDictionary[48], 20, 237);
yield return this.CreateMonsterSpawn(433, this.NpcDictionary[48], 34, 237);
yield return this.CreateMonsterSpawn(434, this.NpcDictionary[48], 47, 231);
yield return this.CreateMonsterSpawn(435, this.NpcDictionary[48], 54, 232);
yield return this.CreateMonsterSpawn(436, this.NpcDictionary[48], 20, 218);
yield return this.CreateMonsterSpawn(437, this.NpcDictionary[48], 34, 176);
}
/// <inheritdoc/>
protected override void CreateMonsters()
{
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 45;
monster.Designation = "Bahamut";
monster.MoveRange = 2;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(8 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 43 },
{ Stats.MaximumHealth, 2400 },
{ Stats.MinimumPhysBaseDmg, 130 },
{ Stats.MaximumPhysBaseDmg, 140 },
{ Stats.DefenseBase, 65 },
{ Stats.AttackRatePvm, 215 },
{ Stats.DefenseRatePvm, 52 },
{ Stats.PoisonResistance, 1f / 255 },
{ Stats.IceResistance, 1f / 255 },
{ Stats.WaterResistance, 1f / 255 },
{ Stats.FireResistance, 1f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 46;
monster.Designation = "Vepar";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(8 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.EnergyBall);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 45 },
{ Stats.MaximumHealth, 2800 },
{ Stats.MinimumPhysBaseDmg, 135 },
{ Stats.MaximumPhysBaseDmg, 145 },
{ Stats.DefenseBase, 70 },
{ Stats.AttackRatePvm, 225 },
{ Stats.DefenseRatePvm, 58 },
{ Stats.PoisonResistance, 2f / 255 },
{ Stats.IceResistance, 2f / 255 },
{ Stats.WaterResistance, 3f / 255 },
{ Stats.FireResistance, 2f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 47;
monster.Designation = "Valkyrie";
monster.MoveRange = 3;
monster.AttackRange = 5;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1800 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(8 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 46 },
{ Stats.MaximumHealth, 3200 },
{ Stats.MinimumPhysBaseDmg, 140 },
{ Stats.MaximumPhysBaseDmg, 150 },
{ Stats.DefenseBase, 75 },
{ Stats.AttackRatePvm, 230 },
{ Stats.DefenseRatePvm, 64 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 2f / 255 },
{ Stats.WaterResistance, 2f / 255 },
{ Stats.FireResistance, 2f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 48;
monster.Designation = "Lizard King";
monster.MoveRange = 3;
monster.AttackRange = 3;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(15 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Lightning);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 70 },
{ Stats.MaximumHealth, 9000 },
{ Stats.MinimumPhysBaseDmg, 240 },
{ Stats.MaximumPhysBaseDmg, 270 },
{ Stats.DefenseBase, 180 },
{ Stats.AttackRatePvm, 350 },
{ Stats.DefenseRatePvm, 115 },
{ Stats.PoisonResistance, 7f / 255 },
{ Stats.IceResistance, 7f / 255 },
{ Stats.WaterResistance, 7f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 49;
monster.Designation = "Hydra";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(150 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.MonsterSkill);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 74 },
{ Stats.MaximumHealth, 19000 },
{ Stats.MinimumPhysBaseDmg, 250 },
{ Stats.MaximumPhysBaseDmg, 310 },
{ Stats.DefenseBase, 200 },
{ Stats.AttackRatePvm, 430 },
{ Stats.DefenseRatePvm, 125 },
{ Stats.PoisonResistance, 12f / 255 },
{ Stats.IceResistance, 12f / 255 },
{ Stats.WaterResistance, 12f / 255 },
{ Stats.FireResistance, 12f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 50;
monster.Designation = "Sea Worm";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(150 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 74 },
{ Stats.MaximumHealth, 19000 },
{ Stats.MinimumPhysBaseDmg, 250 },
{ Stats.MaximumPhysBaseDmg, 310 },
{ Stats.DefenseBase, 200 },
{ Stats.AttackRatePvm, 430 },
{ Stats.DefenseRatePvm, 125 },
{ Stats.PoisonResistance, 12f / 255 },
{ Stats.IceResistance, 12f / 255 },
{ Stats.WaterResistance, 12f / 255 },
{ Stats.FireResistance, 12f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 51;
monster.Designation = "Great Bahamut";
monster.MoveRange = 3;
monster.AttackRange = 2;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(15 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 66 },
{ Stats.MaximumHealth, 7000 },
{ Stats.MinimumPhysBaseDmg, 210 },
{ Stats.MaximumPhysBaseDmg, 230 },
{ Stats.DefenseBase, 150 },
{ Stats.AttackRatePvm, 330 },
{ Stats.DefenseRatePvm, 98 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 6f / 255 },
{ Stats.WaterResistance, 6f / 255 },
{ Stats.FireResistance, 6f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 52;
monster.Designation = "Silver Valkyrie";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(15 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Ice);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 68 },
{ Stats.MaximumHealth, 8000 },
{ Stats.MinimumPhysBaseDmg, 230 },
{ Stats.MaximumPhysBaseDmg, 260 },
{ Stats.DefenseBase, 170 },
{ Stats.AttackRatePvm, 340 },
{ Stats.DefenseRatePvm, 110 },
{ Stats.PoisonResistance, 7f / 255 },
{ Stats.IceResistance, 7f / 255 },
{ Stats.WaterResistance, 7f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
}
}

View File

@@ -0,0 +1,28 @@
// <copyright file="BaseMapInitializer.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.Version075.Maps;
using MUnique.OpenMU.DataModel.Configuration;
/// <summary>
/// Base class for a map initializer which provides some common basic functionality.
/// </summary>
internal abstract class BaseMapInitializer : Initialization.BaseMapInitializer
{
/// <summary>
/// Initializes a new instance of the <see cref="BaseMapInitializer"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
protected BaseMapInitializer(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Gets the version prefix for Terrain resources.
/// </summary>
protected override string TerrainVersionPrefix => "075_";
}

View File

@@ -0,0 +1,286 @@
// <copyright file="Devias.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.Version075.Maps;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// The initialization for the Devias map.
/// </summary>
internal class Devias : BaseMapInitializer
{
/// <summary>
/// The number of this map.
/// </summary>
internal const byte Number = 2;
/// <summary>
/// The name of the map.
/// </summary>
internal const string Name = "Devias";
/// <summary>
/// Initializes a new instance of the <see cref="Devias"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Devias(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[244], 226, 25, Direction.SouthEast);
yield return this.CreateMonsterSpawn(2, this.NpcDictionary[245], 225, 41, Direction.SouthEast);
yield return this.CreateMonsterSpawn(3, this.NpcDictionary[246], 186, 47, Direction.SouthEast);
yield return this.CreateMonsterSpawn(4, this.NpcDictionary[247], 224, 79, Direction.NorthEast);
yield return this.CreateMonsterSpawn(5, this.NpcDictionary[247], 219, 79, Direction.NorthEast);
yield return this.CreateMonsterSpawn(6, this.NpcDictionary[247], 169, 45, Direction.NorthWest);
yield return this.CreateMonsterSpawn(7, this.NpcDictionary[247], 169, 39, Direction.NorthWest);
yield return this.CreateMonsterSpawn(8, this.NpcDictionary[241], 215, 45, Direction.SouthWest);
yield return this.CreateMonsterSpawn(9, this.NpcDictionary[240], 218, 63, Direction.South);
}
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateMonsterSpawns()
{
// Monsters:
yield return this.CreateMonsterSpawn(100, this.NpcDictionary[20], 194, 194, 165, 165, 10);
yield return this.CreateMonsterSpawn(101, this.NpcDictionary[20], 36, 36, 25, 25, 10);
yield return this.CreateMonsterSpawn(102, this.NpcDictionary[20], 210, 242, 210, 220, 15);
yield return this.CreateMonsterSpawn(103, this.NpcDictionary[20], 0, 251, 128, 245, 200);
yield return this.CreateMonsterSpawn(104, this.NpcDictionary[25], 0, 128, 128, 245, 75);
yield return this.CreateMonsterSpawn(105, this.NpcDictionary[23], 0, 128, 0, 128, 75);
yield return this.CreateMonsterSpawn(106, this.NpcDictionary[22], 0, 128, 0, 128, 75);
yield return this.CreateMonsterSpawn(107, this.NpcDictionary[24], 128, 251, 0, 128, 65);
yield return this.CreateMonsterSpawn(108, this.NpcDictionary[21], 128, 251, 0, 128, 35);
}
/// <inheritdoc/>
protected override void CreateMonsters()
{
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 19;
monster.Designation = "Yeti";
monster.MoveRange = 2;
monster.AttackRange = 4;
monster.ViewRange = 6;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.EnergyBall);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 30 },
{ Stats.MaximumHealth, 900 },
{ Stats.MinimumPhysBaseDmg, 105 },
{ Stats.MaximumPhysBaseDmg, 110 },
{ Stats.DefenseBase, 37 },
{ Stats.AttackRatePvm, 150 },
{ Stats.DefenseRatePvm, 37 },
{ Stats.IceResistance, 3f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 20;
monster.Designation = "Elite Yeti";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 6;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 36 },
{ Stats.MaximumHealth, 1200 },
{ Stats.MinimumPhysBaseDmg, 120 },
{ Stats.MaximumPhysBaseDmg, 125 },
{ Stats.DefenseBase, 50 },
{ Stats.AttackRatePvm, 180 },
{ Stats.DefenseRatePvm, 43 },
{ Stats.PoisonResistance, 1f / 255 },
{ Stats.IceResistance, 4f / 255 },
{ Stats.WaterResistance, 1f / 255 },
{ Stats.FireResistance, 1f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 21;
monster.Designation = "Assassin";
monster.MoveRange = 2;
monster.AttackRange = 1;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 26 },
{ Stats.MaximumHealth, 800 },
{ Stats.MinimumPhysBaseDmg, 95 },
{ Stats.MaximumPhysBaseDmg, 100 },
{ Stats.DefenseBase, 33 },
{ Stats.AttackRatePvm, 130 },
{ Stats.DefenseRatePvm, 33 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 22;
monster.Designation = "Ice Monster";
monster.MoveRange = 2;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Ice);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 22 },
{ Stats.MaximumHealth, 650 },
{ Stats.MinimumPhysBaseDmg, 80 },
{ Stats.MaximumPhysBaseDmg, 85 },
{ Stats.DefenseBase, 27 },
{ Stats.AttackRatePvm, 110 },
{ Stats.DefenseRatePvm, 27 },
{ Stats.IceResistance, 3f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 23;
monster.Designation = "Hommerd";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 24 },
{ Stats.MaximumHealth, 700 },
{ Stats.MinimumPhysBaseDmg, 85 },
{ Stats.MaximumPhysBaseDmg, 90 },
{ Stats.DefenseBase, 29 },
{ Stats.AttackRatePvm, 120 },
{ Stats.DefenseRatePvm, 29 },
{ Stats.IceResistance, 3f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 24;
monster.Designation = "Worm";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 20 },
{ Stats.MaximumHealth, 600 },
{ Stats.MinimumPhysBaseDmg, 75 },
{ Stats.MaximumPhysBaseDmg, 80 },
{ Stats.DefenseBase, 25 },
{ Stats.AttackRatePvm, 100 },
{ Stats.DefenseRatePvm, 25 },
{ Stats.IceResistance, 2f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 25;
monster.Designation = "Ice Queen";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(50 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.PowerWave);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 52 },
{ Stats.MaximumHealth, 4000 },
{ Stats.MinimumPhysBaseDmg, 155 },
{ Stats.MaximumPhysBaseDmg, 165 },
{ Stats.DefenseBase, 90 },
{ Stats.AttackRatePvm, 260 },
{ Stats.DefenseRatePvm, 76 },
{ Stats.PoisonResistance, 4f / 255 },
{ Stats.IceResistance, 5f / 255 },
{ Stats.WaterResistance, 4f / 255 },
{ Stats.FireResistance, 4f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,39 @@
// <copyright file="Exile.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.Version075.Maps;
using MUnique.OpenMU.DataModel.Configuration;
/// <summary>
/// The initialization for the Exile map.
/// </summary>
internal class Exile : Initialization.BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 5;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Exile";
/// <summary>
/// Initializes a new instance of the <see cref="Exile"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Exile(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
}

View File

@@ -0,0 +1,289 @@
// <copyright file="Lorencia.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.Version075.Maps;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// The initialization for the Lorencia map.
/// </summary>
internal class Lorencia : BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 0;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Lorencia";
/// <summary>
/// Initializes a new instance of the <see cref="Lorencia"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Lorencia(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[248], 6, 145, Direction.SouthEast, SpawnTrigger.Wandering);
yield return this.CreateMonsterSpawn(2, this.NpcDictionary[240], 146, 110, Direction.SouthEast);
yield return this.CreateMonsterSpawn(3, this.NpcDictionary[240], 147, 145, Direction.SouthWest);
yield return this.CreateMonsterSpawn(4, this.NpcDictionary[249], 131, 88, Direction.SouthWest);
yield return this.CreateMonsterSpawn(5, this.NpcDictionary[249], 173, 125, Direction.SouthEast);
yield return this.CreateMonsterSpawn(6, this.NpcDictionary[249], 94, 125, Direction.NorthWest);
yield return this.CreateMonsterSpawn(7, this.NpcDictionary[249], 94, 130, Direction.NorthWest);
yield return this.CreateMonsterSpawn(8, this.NpcDictionary[249], 131, 148, Direction.SouthWest);
yield return this.CreateMonsterSpawn(9, this.NpcDictionary[247], 114, 125, Direction.SouthEast);
yield return this.CreateMonsterSpawn(10, this.NpcDictionary[250], 183, 137, Direction.South, SpawnTrigger.Wandering);
yield return this.CreateMonsterSpawn(11, this.NpcDictionary[251], 116, 141, Direction.SouthEast);
yield return this.CreateMonsterSpawn(12, this.NpcDictionary[253], 127, 86, Direction.South);
yield return this.CreateMonsterSpawn(13, this.NpcDictionary[254], 118, 113, Direction.SouthEast);
yield return this.CreateMonsterSpawn(14, this.NpcDictionary[255], 123, 135, Direction.SouthWest);
}
/// <inheritdoc />
protected override IEnumerable<MonsterSpawnArea> CreateMonsterSpawns()
{
yield return this.CreateMonsterSpawn(120, this.NpcDictionary[000], 135, 240, 020, 088, 45);
yield return this.CreateMonsterSpawn(121, this.NpcDictionary[003], 180, 226, 090, 244, 45);
yield return this.CreateMonsterSpawn(122, this.NpcDictionary[002], 180, 226, 090, 244, 40);
yield return this.CreateMonsterSpawn(123, this.NpcDictionary[002], 135, 240, 020, 088, 20);
yield return this.CreateMonsterSpawn(124, this.NpcDictionary[006], 095, 175, 168, 244, 20);
yield return this.CreateMonsterSpawn(125, this.NpcDictionary[014], 095, 175, 168, 244, 15);
yield return this.CreateMonsterSpawn(126, this.NpcDictionary[001], 008, 094, 011, 244, 45);
yield return this.CreateMonsterSpawn(127, this.NpcDictionary[004], 008, 094, 011, 244, 45);
yield return this.CreateMonsterSpawn(128, this.NpcDictionary[007], 008, 060, 011, 080, 15);
}
/// <inheritdoc />
protected override void CreateMonsters()
{
{
var bullFighter = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(bullFighter);
bullFighter.Number = 0;
bullFighter.Designation = "Bull Fighter";
bullFighter.MoveRange = 3;
bullFighter.AttackRange = 1;
bullFighter.ViewRange = 5;
bullFighter.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
bullFighter.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
bullFighter.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
bullFighter.Attribute = 2;
bullFighter.NumberOfMaximumItemDrops = 1;
var bullFighterAttributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 6 },
{ Stats.MaximumHealth, 100 },
{ Stats.MinimumPhysBaseDmg, 16 },
{ Stats.MaximumPhysBaseDmg, 20 },
{ Stats.DefenseBase, 6 },
{ Stats.AttackRatePvm, 28 },
{ Stats.DefenseRatePvm, 6 },
};
bullFighter.AddAttributes(bullFighterAttributes, this.Context, this.GameConfiguration);
}
{
var hound = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(hound);
hound.Number = 1;
hound.Designation = "Hound";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 9 },
{ Stats.MaximumHealth, 140 },
{ Stats.MinimumPhysBaseDmg, 22 },
{ Stats.MaximumPhysBaseDmg, 27 },
{ Stats.DefenseBase, 9 },
{ Stats.AttackRatePvm, 39 },
{ Stats.DefenseRatePvm, 9 },
};
hound.AddAttributes(attributes, this.Context, this.GameConfiguration);
hound.MoveRange = 3;
hound.AttackRange = 1;
hound.ViewRange = 5;
hound.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
hound.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
hound.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
hound.Attribute = 2;
hound.NumberOfMaximumItemDrops = 1;
}
{
var budgeDragon = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(budgeDragon);
budgeDragon.Number = 2;
budgeDragon.Designation = "Budge Dragon";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 4 },
{ Stats.MaximumHealth, 60 },
{ Stats.MinimumPhysBaseDmg, 10 },
{ Stats.MaximumPhysBaseDmg, 13 },
{ Stats.DefenseBase, 3 },
{ Stats.AttackRatePvm, 18 },
{ Stats.DefenseRatePvm, 3 },
};
budgeDragon.AddAttributes(attributes, this.Context, this.GameConfiguration);
budgeDragon.MoveRange = 3;
budgeDragon.AttackRange = 1;
budgeDragon.ViewRange = 4;
budgeDragon.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
budgeDragon.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
budgeDragon.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
budgeDragon.Attribute = 2;
budgeDragon.NumberOfMaximumItemDrops = 1;
}
{
var spider = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(spider);
spider.Number = 3;
spider.Designation = "Spider";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 2 },
{ Stats.MaximumHealth, 30 },
{ Stats.MinimumPhysBaseDmg, 4 },
{ Stats.MaximumPhysBaseDmg, 7 },
{ Stats.DefenseBase, 1 },
{ Stats.AttackRatePvm, 8 },
{ Stats.DefenseRatePvm, 1 },
};
spider.AddAttributes(attributes, this.Context, this.GameConfiguration);
spider.MoveRange = 2;
spider.AttackRange = 1;
spider.ViewRange = 5;
spider.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
spider.AttackDelay = new TimeSpan(1800 * TimeSpan.TicksPerMillisecond);
spider.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
spider.Attribute = 2;
spider.NumberOfMaximumItemDrops = 1;
}
{
var eliteBullFighter = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(eliteBullFighter);
eliteBullFighter.Number = 4;
eliteBullFighter.Designation = "Elite Bull Fighter";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 12 },
{ Stats.MaximumHealth, 190 },
{ Stats.MinimumPhysBaseDmg, 31 },
{ Stats.MaximumPhysBaseDmg, 36 },
{ Stats.DefenseBase, 12 },
{ Stats.AttackRatePvm, 50 },
{ Stats.DefenseRatePvm, 12 },
};
eliteBullFighter.AddAttributes(attributes, this.Context, this.GameConfiguration);
eliteBullFighter.MoveRange = 3;
eliteBullFighter.AttackRange = 1;
eliteBullFighter.ViewRange = 4;
eliteBullFighter.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
eliteBullFighter.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
eliteBullFighter.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
eliteBullFighter.Attribute = 2;
eliteBullFighter.NumberOfMaximumItemDrops = 1;
}
{
var lich = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(lich);
lich.Number = 6;
lich.Designation = "Lich";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 14 },
{ Stats.MaximumHealth, 255 },
{ Stats.MinimumPhysBaseDmg, 41 },
{ Stats.MaximumPhysBaseDmg, 46 },
{ Stats.DefenseBase, 14 },
{ Stats.AttackRatePvm, 62 },
{ Stats.DefenseRatePvm, 14 },
{ Stats.FireResistance, 1f / 255 },
};
lich.AddAttributes(attributes, this.Context, this.GameConfiguration);
lich.MoveRange = 3;
lich.AttackRange = 4;
lich.ViewRange = 7;
lich.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
lich.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
lich.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
lich.Attribute = 2;
lich.NumberOfMaximumItemDrops = 1;
lich.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Meteorite);
}
{
var giant = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(giant);
giant.Number = 7;
giant.Designation = "Giant";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 17 },
{ Stats.MaximumHealth, 400 },
{ Stats.MinimumPhysBaseDmg, 57 },
{ Stats.MaximumPhysBaseDmg, 62 },
{ Stats.DefenseBase, 18 },
{ Stats.AttackRatePvm, 80 },
{ Stats.DefenseRatePvm, 18 },
};
giant.AddAttributes(attributes, this.Context, this.GameConfiguration);
giant.MoveRange = 2;
giant.AttackRange = 2;
giant.ViewRange = 3;
giant.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
giant.AttackDelay = new TimeSpan(2200 * TimeSpan.TicksPerMillisecond);
giant.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
giant.Attribute = 2;
giant.NumberOfMaximumItemDrops = 1;
}
{
var skeleton = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(skeleton);
skeleton.Number = 14;
skeleton.Designation = "Skeleton Warrior";
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 19 },
{ Stats.MaximumHealth, 525 },
{ Stats.MinimumPhysBaseDmg, 68 },
{ Stats.MaximumPhysBaseDmg, 74 },
{ Stats.DefenseBase, 22 },
{ Stats.AttackRatePvm, 93 },
{ Stats.DefenseRatePvm, 22 },
};
skeleton.AddAttributes(attributes, this.Context, this.GameConfiguration);
skeleton.MoveRange = 2;
skeleton.AttackRange = 1;
skeleton.ViewRange = 4;
skeleton.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
skeleton.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
skeleton.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
skeleton.Attribute = 2;
skeleton.NumberOfMaximumItemDrops = 1;
}
}
}

View File

@@ -0,0 +1,948 @@
// <copyright file="LostTower.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.Version075.Maps;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.GameLogic.NPC;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// The initialization for the Lost Tower map.
/// </summary>
internal class LostTower : BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 4;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Lost Tower";
/// <summary>
/// Initializes a new instance of the <see cref="LostTower"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public LostTower(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[253], 207, 76, Direction.SouthWest);
yield return this.CreateMonsterSpawn(2, this.NpcDictionary[240], 201, 76, Direction.SouthEast);
}
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateMonsterSpawns()
{
yield return this.CreateMonsterSpawn(100, this.NpcDictionary[40], 6, 98);
yield return this.CreateMonsterSpawn(101, this.NpcDictionary[40], 10, 110);
yield return this.CreateMonsterSpawn(102, this.NpcDictionary[40], 5, 110);
yield return this.CreateMonsterSpawn(103, this.NpcDictionary[40], 15, 105);
yield return this.CreateMonsterSpawn(104, this.NpcDictionary[40], 12, 99);
yield return this.CreateMonsterSpawn(105, this.NpcDictionary[40], 10, 100);
yield return this.CreateMonsterSpawn(106, this.NpcDictionary[40], 12, 100);
yield return this.CreateMonsterSpawn(107, this.NpcDictionary[36], 193, 239);
yield return this.CreateMonsterSpawn(108, this.NpcDictionary[36], 191, 131);
yield return this.CreateMonsterSpawn(109, this.NpcDictionary[36], 191, 118);
yield return this.CreateMonsterSpawn(110, this.NpcDictionary[36], 164, 29);
yield return this.CreateMonsterSpawn(111, this.NpcDictionary[36], 164, 37);
yield return this.CreateMonsterSpawn(112, this.NpcDictionary[36], 164, 48);
yield return this.CreateMonsterSpawn(113, this.NpcDictionary[36], 164, 63);
yield return this.CreateMonsterSpawn(114, this.NpcDictionary[36], 164, 74);
yield return this.CreateMonsterSpawn(115, this.NpcDictionary[36], 195, 40);
yield return this.CreateMonsterSpawn(116, this.NpcDictionary[36], 190, 59);
yield return this.CreateMonsterSpawn(117, this.NpcDictionary[36], 197, 64);
yield return this.CreateMonsterSpawn(118, this.NpcDictionary[36], 244, 72);
yield return this.CreateMonsterSpawn(119, this.NpcDictionary[36], 244, 100);
yield return this.CreateMonsterSpawn(120, this.NpcDictionary[36], 245, 117);
yield return this.CreateMonsterSpawn(121, this.NpcDictionary[36], 219, 117);
yield return this.CreateMonsterSpawn(122, this.NpcDictionary[36], 209, 107);
yield return this.CreateMonsterSpawn(123, this.NpcDictionary[36], 201, 113);
yield return this.CreateMonsterSpawn(124, this.NpcDictionary[36], 212, 87);
yield return this.CreateMonsterSpawn(125, this.NpcDictionary[36], 164, 98);
yield return this.CreateMonsterSpawn(126, this.NpcDictionary[36], 164, 112);
yield return this.CreateMonsterSpawn(127, this.NpcDictionary[36], 164, 126);
yield return this.CreateMonsterSpawn(128, this.NpcDictionary[36], 175, 127);
yield return this.CreateMonsterSpawn(129, this.NpcDictionary[36], 184, 128);
yield return this.CreateMonsterSpawn(130, this.NpcDictionary[36], 199, 134);
yield return this.CreateMonsterSpawn(131, this.NpcDictionary[36], 206, 136);
yield return this.CreateMonsterSpawn(132, this.NpcDictionary[36], 227, 136);
yield return this.CreateMonsterSpawn(133, this.NpcDictionary[36], 242, 135);
yield return this.CreateMonsterSpawn(134, this.NpcDictionary[36], 229, 127);
yield return this.CreateMonsterSpawn(135, this.NpcDictionary[36], 217, 127);
yield return this.CreateMonsterSpawn(136, this.NpcDictionary[36], 244, 89);
yield return this.CreateMonsterSpawn(137, this.NpcDictionary[36], 207, 127);
yield return this.CreateMonsterSpawn(138, this.NpcDictionary[36], 235, 56);
yield return this.CreateMonsterSpawn(139, this.NpcDictionary[36], 235, 38);
yield return this.CreateMonsterSpawn(140, this.NpcDictionary[36], 236, 26);
yield return this.CreateMonsterSpawn(141, this.NpcDictionary[36], 235, 15);
yield return this.CreateMonsterSpawn(142, this.NpcDictionary[36], 226, 14);
yield return this.CreateMonsterSpawn(143, this.NpcDictionary[36], 211, 15);
yield return this.CreateMonsterSpawn(144, this.NpcDictionary[36], 210, 101);
yield return this.CreateMonsterSpawn(145, this.NpcDictionary[36], 210, 114);
yield return this.CreateMonsterSpawn(146, this.NpcDictionary[36], 244, 8);
yield return this.CreateMonsterSpawn(147, this.NpcDictionary[36], 195, 99);
yield return this.CreateMonsterSpawn(148, this.NpcDictionary[36], 226, 118);
yield return this.CreateMonsterSpawn(149, this.NpcDictionary[36], 235, 110);
yield return this.CreateMonsterSpawn(150, this.NpcDictionary[36], 235, 87);
yield return this.CreateMonsterSpawn(151, this.NpcDictionary[36], 199, 124);
yield return this.CreateMonsterSpawn(152, this.NpcDictionary[36], 164, 16);
yield return this.CreateMonsterSpawn(153, this.NpcDictionary[36], 164, 87);
yield return this.CreateMonsterSpawn(154, this.NpcDictionary[36], 200, 104);
yield return this.CreateMonsterSpawn(155, this.NpcDictionary[36], 205, 87);
yield return this.CreateMonsterSpawn(156, this.NpcDictionary[36], 219, 68);
yield return this.CreateMonsterSpawn(157, this.NpcDictionary[36], 211, 64);
yield return this.CreateMonsterSpawn(158, this.NpcDictionary[36], 209, 52);
yield return this.CreateMonsterSpawn(159, this.NpcDictionary[36], 210, 41);
yield return this.CreateMonsterSpawn(160, this.NpcDictionary[36], 210, 32);
yield return this.CreateMonsterSpawn(161, this.NpcDictionary[36], 194, 23);
yield return this.CreateMonsterSpawn(162, this.NpcDictionary[36], 204, 15);
yield return this.CreateMonsterSpawn(163, this.NpcDictionary[36], 236, 44);
yield return this.CreateMonsterSpawn(164, this.NpcDictionary[36], 235, 98);
yield return this.CreateMonsterSpawn(165, this.NpcDictionary[36], 222, 109);
yield return this.CreateMonsterSpawn(166, this.NpcDictionary[36], 218, 87);
yield return this.CreateMonsterSpawn(167, this.NpcDictionary[36], 228, 91);
yield return this.CreateMonsterSpawn(168, this.NpcDictionary[36], 244, 15);
yield return this.CreateMonsterSpawn(169, this.NpcDictionary[36], 228, 7);
yield return this.CreateMonsterSpawn(170, this.NpcDictionary[36], 202, 25);
yield return this.CreateMonsterSpawn(171, this.NpcDictionary[36], 193, 108);
yield return this.CreateMonsterSpawn(172, this.NpcDictionary[36], 209, 94);
yield return this.CreateMonsterSpawn(173, this.NpcDictionary[36], 235, 73);
yield return this.CreateMonsterSpawn(174, this.NpcDictionary[36], 196, 89);
yield return this.CreateMonsterSpawn(175, this.NpcDictionary[36], 219, 94);
yield return this.CreateMonsterSpawn(176, this.NpcDictionary[36], 190, 29);
yield return this.CreateMonsterSpawn(177, this.NpcDictionary[36], 205, 62);
yield return this.CreateMonsterSpawn(178, this.NpcDictionary[35], 29, 208);
yield return this.CreateMonsterSpawn(179, this.NpcDictionary[40], 30, 183);
yield return this.CreateMonsterSpawn(180, this.NpcDictionary[35], 33, 206);
yield return this.CreateMonsterSpawn(181, this.NpcDictionary[40], 54, 213);
yield return this.CreateMonsterSpawn(182, this.NpcDictionary[39], 243, 125);
yield return this.CreateMonsterSpawn(183, this.NpcDictionary[39], 245, 109);
yield return this.CreateMonsterSpawn(184, this.NpcDictionary[39], 219, 6);
yield return this.CreateMonsterSpawn(185, this.NpcDictionary[39], 244, 53);
yield return this.CreateMonsterSpawn(186, this.NpcDictionary[39], 239, 7);
yield return this.CreateMonsterSpawn(187, this.NpcDictionary[39], 244, 25);
yield return this.CreateMonsterSpawn(188, this.NpcDictionary[39], 243, 40);
yield return this.CreateMonsterSpawn(189, this.NpcDictionary[39], 243, 65);
yield return this.CreateMonsterSpawn(190, this.NpcDictionary[39], 244, 82);
yield return this.CreateMonsterSpawn(191, this.NpcDictionary[39], 244, 92);
yield return this.CreateMonsterSpawn(192, this.NpcDictionary[39], 210, 23);
yield return this.CreateMonsterSpawn(193, this.NpcDictionary[39], 226, 22);
yield return this.CreateMonsterSpawn(194, this.NpcDictionary[39], 227, 33);
yield return this.CreateMonsterSpawn(195, this.NpcDictionary[39], 227, 54);
yield return this.CreateMonsterSpawn(196, this.NpcDictionary[39], 228, 67);
yield return this.CreateMonsterSpawn(197, this.NpcDictionary[39], 228, 81);
yield return this.CreateMonsterSpawn(198, this.NpcDictionary[39], 228, 104);
yield return this.CreateMonsterSpawn(199, this.NpcDictionary[39], 191, 16);
yield return this.CreateMonsterSpawn(200, this.NpcDictionary[39], 220, 79);
yield return this.CreateMonsterSpawn(201, this.NpcDictionary[39], 219, 60);
yield return this.CreateMonsterSpawn(202, this.NpcDictionary[39], 219, 45);
yield return this.CreateMonsterSpawn(203, this.NpcDictionary[39], 219, 34);
yield return this.CreateMonsterSpawn(204, this.NpcDictionary[39], 202, 38);
yield return this.CreateMonsterSpawn(205, this.NpcDictionary[39], 208, 166);
yield return this.CreateMonsterSpawn(206, this.NpcDictionary[39], 196, 166);
yield return this.CreateMonsterSpawn(207, this.NpcDictionary[39], 188, 165);
yield return this.CreateMonsterSpawn(208, this.NpcDictionary[39], 179, 165);
yield return this.CreateMonsterSpawn(209, this.NpcDictionary[39], 165, 183);
yield return this.CreateMonsterSpawn(210, this.NpcDictionary[34], 167, 197);
yield return this.CreateMonsterSpawn(211, this.NpcDictionary[39], 167, 211);
yield return this.CreateMonsterSpawn(212, this.NpcDictionary[34], 192, 203);
yield return this.CreateMonsterSpawn(213, this.NpcDictionary[39], 165, 241);
yield return this.CreateMonsterSpawn(214, this.NpcDictionary[39], 184, 246);
yield return this.CreateMonsterSpawn(215, this.NpcDictionary[34], 191, 244);
yield return this.CreateMonsterSpawn(216, this.NpcDictionary[39], 198, 245);
yield return this.CreateMonsterSpawn(217, this.NpcDictionary[39], 214, 245);
yield return this.CreateMonsterSpawn(218, this.NpcDictionary[39], 228, 245);
yield return this.CreateMonsterSpawn(219, this.NpcDictionary[39], 245, 246);
yield return this.CreateMonsterSpawn(220, this.NpcDictionary[34], 235, 237);
yield return this.CreateMonsterSpawn(221, this.NpcDictionary[34], 224, 235);
yield return this.CreateMonsterSpawn(222, this.NpcDictionary[34], 206, 237);
yield return this.CreateMonsterSpawn(223, this.NpcDictionary[34], 200, 228);
yield return this.CreateMonsterSpawn(224, this.NpcDictionary[34], 209, 212);
yield return this.CreateMonsterSpawn(225, this.NpcDictionary[34], 225, 196);
yield return this.CreateMonsterSpawn(226, this.NpcDictionary[34], 209, 190);
yield return this.CreateMonsterSpawn(227, this.NpcDictionary[34], 198, 192);
yield return this.CreateMonsterSpawn(228, this.NpcDictionary[34], 187, 184);
yield return this.CreateMonsterSpawn(229, this.NpcDictionary[34], 193, 173);
yield return this.CreateMonsterSpawn(230, this.NpcDictionary[34], 172, 177);
yield return this.CreateMonsterSpawn(231, this.NpcDictionary[39], 198, 184);
yield return this.CreateMonsterSpawn(232, this.NpcDictionary[39], 217, 196);
yield return this.CreateMonsterSpawn(233, this.NpcDictionary[39], 227, 212);
yield return this.CreateMonsterSpawn(234, this.NpcDictionary[39], 217, 217);
yield return this.CreateMonsterSpawn(235, this.NpcDictionary[39], 201, 216);
yield return this.CreateMonsterSpawn(236, this.NpcDictionary[39], 191, 238);
yield return this.CreateMonsterSpawn(237, this.NpcDictionary[39], 193, 217);
yield return this.CreateMonsterSpawn(238, this.NpcDictionary[39], 178, 224);
yield return this.CreateMonsterSpawn(239, this.NpcDictionary[39], 178, 210);
yield return this.CreateMonsterSpawn(240, this.NpcDictionary[39], 177, 195);
yield return this.CreateMonsterSpawn(241, this.NpcDictionary[41], 126, 246);
yield return this.CreateMonsterSpawn(242, this.NpcDictionary[41], 133, 235);
yield return this.CreateMonsterSpawn(243, this.NpcDictionary[41], 133, 225);
yield return this.CreateMonsterSpawn(244, this.NpcDictionary[34], 133, 185);
yield return this.CreateMonsterSpawn(245, this.NpcDictionary[41], 133, 209);
yield return this.CreateMonsterSpawn(246, this.NpcDictionary[34], 132, 201);
yield return this.CreateMonsterSpawn(247, this.NpcDictionary[41], 125, 189);
yield return this.CreateMonsterSpawn(248, this.NpcDictionary[41], 128, 175);
yield return this.CreateMonsterSpawn(249, this.NpcDictionary[34], 134, 166);
yield return this.CreateMonsterSpawn(250, this.NpcDictionary[41], 129, 167);
yield return this.CreateMonsterSpawn(251, this.NpcDictionary[41], 97, 184);
yield return this.CreateMonsterSpawn(252, this.NpcDictionary[41], 107, 168);
yield return this.CreateMonsterSpawn(253, this.NpcDictionary[34], 95, 173);
yield return this.CreateMonsterSpawn(254, this.NpcDictionary[41], 89, 174);
yield return this.CreateMonsterSpawn(255, this.NpcDictionary[41], 83, 183);
yield return this.CreateMonsterSpawn(256, this.NpcDictionary[34], 86, 190);
yield return this.CreateMonsterSpawn(257, this.NpcDictionary[41], 83, 201);
yield return this.CreateMonsterSpawn(258, this.NpcDictionary[41], 83, 213);
yield return this.CreateMonsterSpawn(259, this.NpcDictionary[41], 89, 224);
yield return this.CreateMonsterSpawn(260, this.NpcDictionary[34], 84, 237);
yield return this.CreateMonsterSpawn(261, this.NpcDictionary[41], 86, 245);
yield return this.CreateMonsterSpawn(262, this.NpcDictionary[34], 98, 245);
yield return this.CreateMonsterSpawn(263, this.NpcDictionary[41], 108, 245);
yield return this.CreateMonsterSpawn(264, this.NpcDictionary[41], 116, 244);
yield return this.CreateMonsterSpawn(265, this.NpcDictionary[41], 118, 229);
yield return this.CreateMonsterSpawn(266, this.NpcDictionary[41], 116, 211);
yield return this.CreateMonsterSpawn(267, this.NpcDictionary[41], 111, 194);
yield return this.CreateMonsterSpawn(268, this.NpcDictionary[41], 115, 178);
yield return this.CreateMonsterSpawn(269, this.NpcDictionary[41], 97, 202);
yield return this.CreateMonsterSpawn(270, this.NpcDictionary[41], 97, 214);
yield return this.CreateMonsterSpawn(271, this.NpcDictionary[41], 102, 225);
yield return this.CreateMonsterSpawn(272, this.NpcDictionary[41], 98, 236);
yield return this.CreateMonsterSpawn(273, this.NpcDictionary[34], 111, 219);
yield return this.CreateMonsterSpawn(274, this.NpcDictionary[34], 123, 224);
yield return this.CreateMonsterSpawn(275, this.NpcDictionary[41], 116, 134);
yield return this.CreateMonsterSpawn(276, this.NpcDictionary[41], 97, 133);
yield return this.CreateMonsterSpawn(277, this.NpcDictionary[41], 85, 132);
yield return this.CreateMonsterSpawn(278, this.NpcDictionary[41], 85, 116);
yield return this.CreateMonsterSpawn(279, this.NpcDictionary[41], 85, 96);
yield return this.CreateMonsterSpawn(280, this.NpcDictionary[41], 101, 87);
yield return this.CreateMonsterSpawn(281, this.NpcDictionary[41], 118, 89);
yield return this.CreateMonsterSpawn(282, this.NpcDictionary[37], 133, 87);
yield return this.CreateMonsterSpawn(283, this.NpcDictionary[41], 116, 113);
yield return this.CreateMonsterSpawn(284, this.NpcDictionary[41], 133, 115);
yield return this.CreateMonsterSpawn(285, this.NpcDictionary[37], 104, 136);
yield return this.CreateMonsterSpawn(286, this.NpcDictionary[41], 124, 136);
yield return this.CreateMonsterSpawn(287, this.NpcDictionary[37], 96, 116);
yield return this.CreateMonsterSpawn(288, this.NpcDictionary[37], 94, 100);
yield return this.CreateMonsterSpawn(289, this.NpcDictionary[37], 89, 135);
yield return this.CreateMonsterSpawn(290, this.NpcDictionary[37], 133, 98);
yield return this.CreateMonsterSpawn(291, this.NpcDictionary[41], 106, 112);
yield return this.CreateMonsterSpawn(292, this.NpcDictionary[41], 95, 106);
yield return this.CreateMonsterSpawn(293, this.NpcDictionary[37], 112, 87);
yield return this.CreateMonsterSpawn(294, this.NpcDictionary[37], 133, 109);
yield return this.CreateMonsterSpawn(295, this.NpcDictionary[37], 121, 119);
yield return this.CreateMonsterSpawn(296, this.NpcDictionary[37], 123, 130);
yield return this.CreateMonsterSpawn(297, this.NpcDictionary[37], 87, 7);
yield return this.CreateMonsterSpawn(298, this.NpcDictionary[37], 97, 6);
yield return this.CreateMonsterSpawn(299, this.NpcDictionary[40], 117, 8);
yield return this.CreateMonsterSpawn(300, this.NpcDictionary[37], 124, 11);
yield return this.CreateMonsterSpawn(301, this.NpcDictionary[37], 133, 26);
yield return this.CreateMonsterSpawn(302, this.NpcDictionary[37], 134, 37);
yield return this.CreateMonsterSpawn(303, this.NpcDictionary[37], 134, 49);
yield return this.CreateMonsterSpawn(304, this.NpcDictionary[40], 123, 54);
yield return this.CreateMonsterSpawn(305, this.NpcDictionary[37], 115, 53);
yield return this.CreateMonsterSpawn(306, this.NpcDictionary[37], 98, 54);
yield return this.CreateMonsterSpawn(307, this.NpcDictionary[37], 84, 54);
yield return this.CreateMonsterSpawn(308, this.NpcDictionary[37], 93, 41);
yield return this.CreateMonsterSpawn(309, this.NpcDictionary[37], 99, 40);
yield return this.CreateMonsterSpawn(310, this.NpcDictionary[37], 101, 29);
yield return this.CreateMonsterSpawn(311, this.NpcDictionary[37], 98, 17);
yield return this.CreateMonsterSpawn(312, this.NpcDictionary[37], 112, 16);
yield return this.CreateMonsterSpawn(313, this.NpcDictionary[37], 124, 41);
yield return this.CreateMonsterSpawn(314, this.NpcDictionary[37], 111, 39);
yield return this.CreateMonsterSpawn(315, this.NpcDictionary[40], 86, 41);
yield return this.CreateMonsterSpawn(316, this.NpcDictionary[40], 98, 24);
yield return this.CreateMonsterSpawn(317, this.NpcDictionary[40], 115, 28);
yield return this.CreateMonsterSpawn(318, this.NpcDictionary[40], 55, 15);
yield return this.CreateMonsterSpawn(319, this.NpcDictionary[40], 46, 13);
yield return this.CreateMonsterSpawn(320, this.NpcDictionary[37], 39, 11);
yield return this.CreateMonsterSpawn(321, this.NpcDictionary[40], 22, 17);
yield return this.CreateMonsterSpawn(322, this.NpcDictionary[37], 14, 24);
yield return this.CreateMonsterSpawn(323, this.NpcDictionary[37], 53, 39);
yield return this.CreateMonsterSpawn(324, this.NpcDictionary[40], 10, 41);
yield return this.CreateMonsterSpawn(325, this.NpcDictionary[37], 7, 52);
yield return this.CreateMonsterSpawn(326, this.NpcDictionary[40], 15, 54);
yield return this.CreateMonsterSpawn(327, this.NpcDictionary[37], 25, 49);
yield return this.CreateMonsterSpawn(328, this.NpcDictionary[40], 38, 48);
yield return this.CreateMonsterSpawn(329, this.NpcDictionary[40], 48, 48);
yield return this.CreateMonsterSpawn(330, this.NpcDictionary[40], 41, 57);
yield return this.CreateMonsterSpawn(331, this.NpcDictionary[34], 123, 201);
yield return this.CreateMonsterSpawn(332, this.NpcDictionary[40], 55, 28);
yield return this.CreateMonsterSpawn(333, this.NpcDictionary[35], 46, 25);
yield return this.CreateMonsterSpawn(334, this.NpcDictionary[37], 30, 32);
yield return this.CreateMonsterSpawn(335, this.NpcDictionary[35], 23, 40);
yield return this.CreateMonsterSpawn(336, this.NpcDictionary[40], 22, 30);
yield return this.CreateMonsterSpawn(337, this.NpcDictionary[40], 39, 38);
yield return this.CreateMonsterSpawn(338, this.NpcDictionary[40], 6, 98);
yield return this.CreateMonsterSpawn(339, this.NpcDictionary[40], 33, 86);
yield return this.CreateMonsterSpawn(340, this.NpcDictionary[40], 46, 86);
yield return this.CreateMonsterSpawn(341, this.NpcDictionary[40], 55, 87);
yield return this.CreateMonsterSpawn(342, this.NpcDictionary[40], 53, 97);
yield return this.CreateMonsterSpawn(343, this.NpcDictionary[35], 42, 97);
yield return this.CreateMonsterSpawn(344, this.NpcDictionary[40], 35, 98);
yield return this.CreateMonsterSpawn(345, this.NpcDictionary[40], 25, 98);
yield return this.CreateMonsterSpawn(346, this.NpcDictionary[35], 15, 127);
yield return this.CreateMonsterSpawn(347, this.NpcDictionary[40], 8, 107);
yield return this.CreateMonsterSpawn(348, this.NpcDictionary[40], 53, 116);
yield return this.CreateMonsterSpawn(349, this.NpcDictionary[40], 41, 121);
yield return this.CreateMonsterSpawn(350, this.NpcDictionary[34], 115, 167);
yield return this.CreateMonsterSpawn(351, this.NpcDictionary[40], 25, 135);
yield return this.CreateMonsterSpawn(352, this.NpcDictionary[40], 42, 135);
yield return this.CreateMonsterSpawn(353, this.NpcDictionary[40], 52, 135);
yield return this.CreateMonsterSpawn(354, this.NpcDictionary[35], 30, 171);
yield return this.CreateMonsterSpawn(355, this.NpcDictionary[40], 38, 227);
yield return this.CreateMonsterSpawn(356, this.NpcDictionary[35], 8, 191);
yield return this.CreateMonsterSpawn(357, this.NpcDictionary[40], 51, 183);
yield return this.CreateMonsterSpawn(358, this.NpcDictionary[35], 8, 211);
yield return this.CreateMonsterSpawn(359, this.NpcDictionary[35], 8, 231);
yield return this.CreateMonsterSpawn(360, this.NpcDictionary[35], 15, 244);
yield return this.CreateMonsterSpawn(361, this.NpcDictionary[35], 18, 107);
yield return this.CreateMonsterSpawn(362, this.NpcDictionary[35], 39, 246);
yield return this.CreateMonsterSpawn(363, this.NpcDictionary[35], 11, 175);
yield return this.CreateMonsterSpawn(364, this.NpcDictionary[35], 54, 220);
yield return this.CreateMonsterSpawn(365, this.NpcDictionary[35], 31, 127);
yield return this.CreateMonsterSpawn(366, this.NpcDictionary[35], 55, 195);
yield return this.CreateMonsterSpawn(367, this.NpcDictionary[34], 105, 175);
yield return this.CreateMonsterSpawn(368, this.NpcDictionary[35], 55, 174);
yield return this.CreateMonsterSpawn(369, this.NpcDictionary[38], 31, 212);
yield return this.CreateMonsterSpawn(370, this.NpcDictionary[35], 30, 233);
yield return this.CreateMonsterSpawn(371, this.NpcDictionary[35], 21, 216);
yield return this.CreateMonsterSpawn(372, this.NpcDictionary[35], 38, 212);
yield return this.CreateMonsterSpawn(373, this.NpcDictionary[35], 29, 200);
yield return this.CreateMonsterSpawn(374, this.NpcDictionary[40], 24, 189);
yield return this.CreateMonsterSpawn(375, this.NpcDictionary[40], 48, 167);
yield return this.CreateMonsterSpawn(376, this.NpcDictionary[40], 41, 167);
yield return this.CreateMonsterSpawn(377, this.NpcDictionary[35], 38, 234);
yield return this.CreateMonsterSpawn(378, this.NpcDictionary[37], 38, 201);
yield return this.CreateMonsterSpawn(379, this.NpcDictionary[37], 18, 200);
yield return this.CreateMonsterSpawn(380, this.NpcDictionary[37], 13, 191);
yield return this.CreateMonsterSpawn(381, this.NpcDictionary[37], 38, 192);
yield return this.CreateMonsterSpawn(382, this.NpcDictionary[34], 215, 174);
yield return this.CreateMonsterSpawn(383, this.NpcDictionary[34], 245, 168);
yield return this.CreateMonsterSpawn(384, this.NpcDictionary[34], 235, 214);
yield return this.CreateMonsterSpawn(385, this.NpcDictionary[34], 165, 223);
yield return this.CreateMonsterSpawn(386, this.NpcDictionary[34], 127, 239);
yield return this.CreateMonsterSpawn(387, this.NpcDictionary[34], 125, 180);
yield return this.CreateMonsterSpawn(388, this.NpcDictionary[34], 113, 189);
yield return this.CreateMonsterSpawn(389, this.NpcDictionary[34], 98, 231);
yield return this.CreateMonsterSpawn(390, this.NpcDictionary[37], 89, 119);
yield return this.CreateMonsterSpawn(391, this.NpcDictionary[37], 86, 100);
yield return this.CreateMonsterSpawn(392, this.NpcDictionary[37], 108, 116);
yield return this.CreateMonsterSpawn(393, this.NpcDictionary[37], 126, 108);
yield return this.CreateMonsterSpawn(394, this.NpcDictionary[37], 86, 26);
yield return this.CreateMonsterSpawn(395, this.NpcDictionary[37], 111, 26);
yield return this.CreateMonsterSpawn(396, this.NpcDictionary[37], 48, 17);
yield return this.CreateMonsterSpawn(397, this.NpcDictionary[37], 13, 9);
yield return this.CreateMonsterSpawn(398, this.NpcDictionary[37], 16, 41);
yield return this.CreateMonsterSpawn(399, this.NpcDictionary[37], 38, 53);
yield return this.CreateMonsterSpawn(400, this.NpcDictionary[37], 54, 51);
yield return this.CreateMonsterSpawn(401, this.NpcDictionary[37], 45, 32);
yield return this.CreateMonsterSpawn(402, this.NpcDictionary[37], 25, 86);
yield return this.CreateMonsterSpawn(403, this.NpcDictionary[37], 52, 92);
yield return this.CreateMonsterSpawn(404, this.NpcDictionary[37], 30, 102);
yield return this.CreateMonsterSpawn(405, this.NpcDictionary[35], 34, 108);
yield return this.CreateMonsterSpawn(406, this.NpcDictionary[35], 53, 111);
yield return this.CreateMonsterSpawn(407, this.NpcDictionary[35], 45, 137);
yield return this.CreateMonsterSpawn(408, this.NpcDictionary[35], 11, 96);
yield return this.CreateMonsterSpawn(409, this.NpcDictionary[35], 43, 170);
yield return this.CreateMonsterSpawn(410, this.NpcDictionary[35], 8, 220);
yield return this.CreateMonsterSpawn(411, this.NpcDictionary[35], 27, 247);
yield return this.CreateMonsterSpawn(412, this.NpcDictionary[35], 54, 232);
yield return this.CreateMonsterSpawn(413, this.NpcDictionary[35], 24, 225);
yield return this.CreateMonsterSpawn(414, this.NpcDictionary[39], 226, 166);
yield return this.CreateMonsterSpawn(415, this.NpcDictionary[39], 239, 167);
yield return this.CreateMonsterSpawn(416, this.NpcDictionary[39], 227, 175);
yield return this.CreateMonsterSpawn(417, this.NpcDictionary[39], 239, 174);
yield return this.CreateMonsterSpawn(418, this.NpcDictionary[39], 245, 179);
yield return this.CreateMonsterSpawn(419, this.NpcDictionary[39], 245, 189);
yield return this.CreateMonsterSpawn(420, this.NpcDictionary[39], 245, 200);
yield return this.CreateMonsterSpawn(421, this.NpcDictionary[39], 246, 212);
yield return this.CreateMonsterSpawn(422, this.NpcDictionary[39], 245, 224);
yield return this.CreateMonsterSpawn(423, this.NpcDictionary[39], 237, 226);
yield return this.CreateMonsterSpawn(424, this.NpcDictionary[39], 236, 220);
yield return this.CreateMonsterSpawn(425, this.NpcDictionary[39], 238, 208);
yield return this.CreateMonsterSpawn(426, this.NpcDictionary[39], 237, 201);
yield return this.CreateMonsterSpawn(427, this.NpcDictionary[39], 232, 196);
yield return this.CreateMonsterSpawn(428, this.NpcDictionary[39], 238, 184);
yield return this.CreateMonsterSpawn(429, this.NpcDictionary[39], 224, 185);
yield return this.CreateMonsterSpawn(430, this.NpcDictionary[39], 216, 183);
yield return this.CreateMonsterSpawn(431, this.NpcDictionary[39], 207, 178);
yield return this.CreateMonsterSpawn(432, this.NpcDictionary[39], 196, 176);
yield return this.CreateMonsterSpawn(433, this.NpcDictionary[39], 187, 192);
yield return this.CreateMonsterSpawn(434, this.NpcDictionary[39], 185, 201);
yield return this.CreateMonsterSpawn(435, this.NpcDictionary[39], 187, 209);
yield return this.CreateMonsterSpawn(436, this.NpcDictionary[39], 185, 220);
yield return this.CreateMonsterSpawn(437, this.NpcDictionary[39], 175, 217);
yield return this.CreateMonsterSpawn(438, this.NpcDictionary[39], 176, 245);
yield return this.CreateMonsterSpawn(439, this.NpcDictionary[39], 206, 244);
yield return this.CreateMonsterSpawn(440, this.NpcDictionary[39], 215, 209);
yield return this.CreateMonsterSpawn(441, this.NpcDictionary[39], 184, 173);
yield return this.CreateMonsterSpawn(442, this.NpcDictionary[39], 172, 188);
yield return this.CreateMonsterSpawn(443, this.NpcDictionary[39], 173, 171);
yield return this.CreateMonsterSpawn(444, this.NpcDictionary[39], 206, 200);
yield return this.CreateMonsterSpawn(445, this.NpcDictionary[39], 218, 229);
yield return this.CreateMonsterSpawn(446, this.NpcDictionary[34], 112, 235);
yield return this.CreateMonsterSpawn(447, this.NpcDictionary[34], 83, 220);
yield return this.CreateMonsterSpawn(448, this.NpcDictionary[34], 90, 239);
yield return this.CreateMonsterSpawn(449, this.NpcDictionary[34], 133, 215);
yield return this.CreateMonsterSpawn(450, this.NpcDictionary[34], 88, 206);
yield return this.CreateMonsterSpawn(451, this.NpcDictionary[34], 121, 235);
yield return this.CreateMonsterSpawn(452, this.NpcDictionary[41], 104, 183);
yield return this.CreateMonsterSpawn(453, this.NpcDictionary[41], 86, 109);
yield return this.CreateMonsterSpawn(454, this.NpcDictionary[41], 96, 86);
yield return this.CreateMonsterSpawn(455, this.NpcDictionary[41], 128, 86);
yield return this.CreateMonsterSpawn(456, this.NpcDictionary[41], 122, 101);
yield return this.CreateMonsterSpawn(457, this.NpcDictionary[41], 101, 100);
yield return this.CreateMonsterSpawn(458, this.NpcDictionary[41], 86, 125);
yield return this.CreateMonsterSpawn(459, this.NpcDictionary[41], 132, 124);
yield return this.CreateMonsterSpawn(460, this.NpcDictionary[37], 110, 100);
yield return this.CreateMonsterSpawn(461, this.NpcDictionary[40], 103, 8);
yield return this.CreateMonsterSpawn(462, this.NpcDictionary[37], 128, 6);
yield return this.CreateMonsterSpawn(463, this.NpcDictionary[40], 127, 34);
yield return this.CreateMonsterSpawn(464, this.NpcDictionary[40], 130, 48);
yield return this.CreateMonsterSpawn(465, this.NpcDictionary[40], 105, 55);
yield return this.CreateMonsterSpawn(466, this.NpcDictionary[40], 84, 16);
yield return this.CreateMonsterSpawn(467, this.NpcDictionary[40], 124, 24);
yield return this.CreateMonsterSpawn(468, this.NpcDictionary[35], 14, 15);
yield return this.CreateMonsterSpawn(469, this.NpcDictionary[35], 13, 33);
yield return this.CreateMonsterSpawn(470, this.NpcDictionary[35], 30, 39);
yield return this.CreateMonsterSpawn(471, this.NpcDictionary[35], 55, 8);
yield return this.CreateMonsterSpawn(472, this.NpcDictionary[35], 44, 41);
yield return this.CreateMonsterSpawn(473, this.NpcDictionary[35], 8, 25);
yield return this.CreateMonsterSpawn(474, this.NpcDictionary[35], 37, 21);
yield return this.CreateMonsterSpawn(475, this.NpcDictionary[35], 29, 24);
yield return this.CreateMonsterSpawn(476, this.NpcDictionary[35], 19, 97);
yield return this.CreateMonsterSpawn(477, this.NpcDictionary[35], 42, 109);
yield return this.CreateMonsterSpawn(478, this.NpcDictionary[35], 22, 121);
yield return this.CreateMonsterSpawn(479, this.NpcDictionary[35], 5, 122);
yield return this.CreateMonsterSpawn(480, this.NpcDictionary[35], 5, 132);
yield return this.CreateMonsterSpawn(481, this.NpcDictionary[35], 14, 137);
yield return this.CreateMonsterSpawn(482, this.NpcDictionary[35], 38, 184);
yield return this.CreateMonsterSpawn(483, this.NpcDictionary[35], 36, 174);
yield return this.CreateMonsterSpawn(484, this.NpcDictionary[35], 23, 174);
yield return this.CreateMonsterSpawn(485, this.NpcDictionary[35], 18, 168);
yield return this.CreateMonsterSpawn(486, this.NpcDictionary[35], 7, 184);
yield return this.CreateMonsterSpawn(487, this.NpcDictionary[35], 8, 200);
yield return this.CreateMonsterSpawn(488, this.NpcDictionary[35], 19, 208);
yield return this.CreateMonsterSpawn(489, this.NpcDictionary[35], 50, 241);
yield return this.CreateMonsterSpawn(490, this.NpcDictionary[35], 54, 205);
yield return this.CreateMonsterSpawn(491, this.NpcDictionary[40], 46, 208);
yield return this.CreateMonsterSpawn(492, this.NpcDictionary[40], 18, 183);
yield return this.CreateMonsterSpawn(493, this.NpcDictionary[40], 14, 224);
yield return this.CreateMonsterSpawn(494, this.NpcDictionary[40], 7, 240);
yield return this.CreateMonsterSpawn(495, this.NpcDictionary[40], 48, 232);
yield return this.CreateMonsterSpawn(496, this.NpcDictionary[40], 48, 215);
yield return this.CreateMonsterSpawn(497, this.NpcDictionary[40], 49, 191);
yield return this.CreateMonsterSpawn(498, this.NpcDictionary[40], 48, 174);
yield return this.CreateMonsterSpawn(499, this.NpcDictionary[38], 28, 212);
yield return this.CreateMonsterSpawn(500, this.NpcDictionary[40], 23, 239);
yield return this.CreateMonsterSpawn(501, this.NpcDictionary[35], 23, 195);
yield return this.CreateMonsterSpawn(502, this.NpcDictionary[35], 31, 191);
yield return this.CreateMonsterSpawn(503, this.NpcDictionary[35], 25, 167);
yield return this.CreateMonsterSpawn(504, this.NpcDictionary[40], 11, 168);
yield return this.CreateMonsterSpawn(505, this.NpcDictionary[40], 4, 177);
yield return this.CreateMonsterSpawn(506, this.NpcDictionary[40], 47, 247);
yield return this.CreateMonsterSpawn(507, this.NpcDictionary[34], 104, 232);
yield return this.CreateMonsterSpawn(508, this.NpcDictionary[34], 102, 217);
yield return this.CreateMonsterSpawn(509, this.NpcDictionary[34], 103, 205);
yield return this.CreateMonsterSpawn(510, this.NpcDictionary[41], 103, 197);
yield return this.CreateMonsterSpawn(511, this.NpcDictionary[41], 97, 196);
yield return this.CreateMonsterSpawn(512, this.NpcDictionary[34], 101, 188);
yield return this.CreateMonsterSpawn(513, this.NpcDictionary[34], 110, 206);
yield return this.CreateMonsterSpawn(514, this.NpcDictionary[41], 115, 199);
yield return this.CreateMonsterSpawn(515, this.NpcDictionary[41], 135, 174);
yield return this.CreateMonsterSpawn(516, this.NpcDictionary[41], 122, 167);
yield return this.CreateMonsterSpawn(517, this.NpcDictionary[41], 101, 168);
yield return this.CreateMonsterSpawn(518, this.NpcDictionary[34], 96, 167);
yield return this.CreateMonsterSpawn(519, this.NpcDictionary[37], 26, 108);
yield return this.CreateMonsterSpawn(520, this.NpcDictionary[40], 19, 86);
yield return this.CreateMonsterSpawn(521, this.NpcDictionary[40], 15, 119);
yield return this.CreateMonsterSpawn(522, this.NpcDictionary[35], 34, 137);
yield return this.CreateMonsterSpawn(523, this.NpcDictionary[35], 54, 121);
yield return this.CreateMonsterSpawn(524, this.NpcDictionary[35], 30, 10);
yield return this.CreateMonsterSpawn(525, this.NpcDictionary[40], 24, 9);
yield return this.CreateMonsterSpawn(526, this.NpcDictionary[40], 30, 17);
yield return this.CreateMonsterSpawn(527, this.NpcDictionary[40], 110, 8);
yield return this.CreateMonsterSpawn(528, this.NpcDictionary[40], 134, 8);
yield return this.CreateMonsterSpawn(529, this.NpcDictionary[40], 135, 17);
yield return this.CreateMonsterSpawn(530, this.NpcDictionary[40], 111, 46);
yield return this.CreateMonsterSpawn(531, this.NpcDictionary[40], 99, 48);
yield return this.CreateMonsterSpawn(532, this.NpcDictionary[40], 85, 49);
yield return this.CreateMonsterSpawn(533, this.NpcDictionary[40], 91, 56);
yield return this.CreateMonsterSpawn(534, this.NpcDictionary[39], 195, 32);
yield return this.CreateMonsterSpawn(535, this.NpcDictionary[39], 189, 38);
yield return this.CreateMonsterSpawn(536, this.NpcDictionary[36], 195, 40);
yield return this.CreateMonsterSpawn(537, this.NpcDictionary[39], 189, 48);
yield return this.CreateMonsterSpawn(538, this.NpcDictionary[39], 196, 54);
yield return this.CreateMonsterSpawn(539, this.NpcDictionary[39], 196, 207);
yield return this.CreateMonsterSpawn(540, this.NpcDictionary[39], 195, 200);
yield return this.CreateMonsterSpawn(541, this.NpcDictionary[39], 230, 229);
yield return this.CreateMonsterSpawn(542, this.NpcDictionary[34], 238, 213);
yield return this.CreateMonsterSpawn(543, this.NpcDictionary[34], 210, 225);
yield return this.CreateMonsterSpawn(544, this.NpcDictionary[34], 215, 236);
yield return this.CreateMonsterSpawn(545, this.NpcDictionary[39], 173, 227);
yield return this.CreateMonsterSpawn(546, this.NpcDictionary[39], 183, 233);
yield return this.CreateMonsterSpawn(547, this.NpcDictionary[39], 173, 237);
// Traps:
yield return this.CreateMonsterSpawn(550, this.NpcDictionary[103], 5, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(551, this.NpcDictionary[103], 6, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(552, this.NpcDictionary[103], 4, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(553, this.NpcDictionary[103], 15, 172, Direction.SouthEast);
yield return this.CreateMonsterSpawn(554, this.NpcDictionary[103], 15, 173, Direction.SouthEast);
yield return this.CreateMonsterSpawn(555, this.NpcDictionary[103], 15, 174, Direction.SouthEast);
yield return this.CreateMonsterSpawn(556, this.NpcDictionary[103], 14, 207, Direction.SouthEast);
yield return this.CreateMonsterSpawn(557, this.NpcDictionary[103], 4, 194, Direction.SouthEast);
yield return this.CreateMonsterSpawn(558, this.NpcDictionary[103], 5, 194, Direction.SouthEast);
yield return this.CreateMonsterSpawn(559, this.NpcDictionary[103], 6, 194, Direction.SouthEast);
yield return this.CreateMonsterSpawn(560, this.NpcDictionary[103], 14, 208, Direction.SouthEast);
yield return this.CreateMonsterSpawn(561, this.NpcDictionary[103], 5, 237, Direction.SouthEast);
yield return this.CreateMonsterSpawn(562, this.NpcDictionary[103], 6, 237, Direction.SouthEast);
yield return this.CreateMonsterSpawn(563, this.NpcDictionary[103], 7, 237, Direction.SouthEast);
yield return this.CreateMonsterSpawn(564, this.NpcDictionary[103], 26, 104, Direction.SouthEast);
yield return this.CreateMonsterSpawn(565, this.NpcDictionary[103], 26, 103, Direction.SouthEast);
yield return this.CreateMonsterSpawn(566, this.NpcDictionary[103], 26, 102, Direction.SouthEast);
yield return this.CreateMonsterSpawn(567, this.NpcDictionary[103], 26, 101, Direction.SouthEast);
yield return this.CreateMonsterSpawn(568, this.NpcDictionary[103], 30, 101, Direction.SouthEast);
yield return this.CreateMonsterSpawn(569, this.NpcDictionary[103], 30, 100, Direction.SouthEast);
yield return this.CreateMonsterSpawn(570, this.NpcDictionary[103], 30, 99, Direction.SouthEast);
yield return this.CreateMonsterSpawn(571, this.NpcDictionary[103], 29, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(572, this.NpcDictionary[103], 28, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(573, this.NpcDictionary[103], 27, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(574, this.NpcDictionary[103], 26, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(575, this.NpcDictionary[103], 27, 128, Direction.SouthWest);
yield return this.CreateMonsterSpawn(576, this.NpcDictionary[103], 27, 129, Direction.SouthWest);
yield return this.CreateMonsterSpawn(577, this.NpcDictionary[103], 27, 130, Direction.SouthWest);
yield return this.CreateMonsterSpawn(578, this.NpcDictionary[103], 21, 243, Direction.SouthEast);
yield return this.CreateMonsterSpawn(579, this.NpcDictionary[103], 22, 243, Direction.SouthEast);
yield return this.CreateMonsterSpawn(580, this.NpcDictionary[103], 23, 243, Direction.SouthEast);
yield return this.CreateMonsterSpawn(581, this.NpcDictionary[103], 45, 110, Direction.SouthWest);
yield return this.CreateMonsterSpawn(582, this.NpcDictionary[103], 45, 110, Direction.SouthWest);
yield return this.CreateMonsterSpawn(583, this.NpcDictionary[103], 45, 110, Direction.NorthEast);
yield return this.CreateMonsterSpawn(584, this.NpcDictionary[103], 45, 109, Direction.NorthEast);
yield return this.CreateMonsterSpawn(585, this.NpcDictionary[103], 45, 108, Direction.NorthEast);
yield return this.CreateMonsterSpawn(586, this.NpcDictionary[103], 38, 110, Direction.NorthEast);
yield return this.CreateMonsterSpawn(587, this.NpcDictionary[103], 38, 109, Direction.NorthEast);
yield return this.CreateMonsterSpawn(588, this.NpcDictionary[103], 38, 108, Direction.NorthEast);
yield return this.CreateMonsterSpawn(589, this.NpcDictionary[103], 35, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(590, this.NpcDictionary[103], 34, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(591, this.NpcDictionary[103], 33, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(592, this.NpcDictionary[103], 36, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(593, this.NpcDictionary[103], 37, 119, Direction.SouthEast);
yield return this.CreateMonsterSpawn(594, this.NpcDictionary[103], 37, 120, Direction.SouthEast);
yield return this.CreateMonsterSpawn(595, this.NpcDictionary[103], 34, 128, Direction.SouthWest);
yield return this.CreateMonsterSpawn(596, this.NpcDictionary[103], 34, 129, Direction.SouthWest);
yield return this.CreateMonsterSpawn(597, this.NpcDictionary[103], 34, 130, Direction.SouthWest);
yield return this.CreateMonsterSpawn(598, this.NpcDictionary[103], 47, 131, Direction.SouthWest);
yield return this.CreateMonsterSpawn(599, this.NpcDictionary[103], 47, 132, Direction.SouthWest);
yield return this.CreateMonsterSpawn(600, this.NpcDictionary[103], 41, 132, Direction.SouthWest);
yield return this.CreateMonsterSpawn(601, this.NpcDictionary[103], 41, 133, Direction.SouthWest);
yield return this.CreateMonsterSpawn(602, this.NpcDictionary[103], 36, 133, Direction.SouthWest);
yield return this.CreateMonsterSpawn(603, this.NpcDictionary[103], 36, 134, Direction.SouthWest);
yield return this.CreateMonsterSpawn(604, this.NpcDictionary[103], 46, 169, Direction.SouthEast);
yield return this.CreateMonsterSpawn(605, this.NpcDictionary[103], 46, 170, Direction.SouthEast);
yield return this.CreateMonsterSpawn(606, this.NpcDictionary[103], 46, 171, Direction.SouthEast);
yield return this.CreateMonsterSpawn(607, this.NpcDictionary[103], 46, 172, Direction.SouthEast);
yield return this.CreateMonsterSpawn(608, this.NpcDictionary[103], 42, 245, Direction.SouthEast);
yield return this.CreateMonsterSpawn(609, this.NpcDictionary[103], 42, 246, Direction.SouthEast);
yield return this.CreateMonsterSpawn(610, this.NpcDictionary[103], 52, 114, Direction.SouthEast);
yield return this.CreateMonsterSpawn(611, this.NpcDictionary[103], 53, 114, Direction.SouthEast);
yield return this.CreateMonsterSpawn(612, this.NpcDictionary[103], 54, 114, Direction.SouthEast);
yield return this.CreateMonsterSpawn(613, this.NpcDictionary[103], 53, 178, Direction.SouthEast);
yield return this.CreateMonsterSpawn(614, this.NpcDictionary[103], 54, 178, Direction.SouthEast);
yield return this.CreateMonsterSpawn(615, this.NpcDictionary[103], 52, 178, Direction.SouthEast);
yield return this.CreateMonsterSpawn(616, this.NpcDictionary[103], 51, 198, Direction.SouthEast);
yield return this.CreateMonsterSpawn(617, this.NpcDictionary[103], 51, 199, Direction.SouthEast);
yield return this.CreateMonsterSpawn(618, this.NpcDictionary[103], 51, 200, Direction.SouthEast);
yield return this.CreateMonsterSpawn(619, this.NpcDictionary[103], 51, 201, Direction.SouthEast);
yield return this.CreateMonsterSpawn(620, this.NpcDictionary[103], 85, 120, Direction.SouthEast);
yield return this.CreateMonsterSpawn(621, this.NpcDictionary[103], 86, 120, Direction.SouthEast);
yield return this.CreateMonsterSpawn(622, this.NpcDictionary[103], 84, 120, Direction.SouthEast);
yield return this.CreateMonsterSpawn(623, this.NpcDictionary[103], 93, 131, Direction.SouthEast);
yield return this.CreateMonsterSpawn(624, this.NpcDictionary[103], 93, 130, Direction.SouthEast);
yield return this.CreateMonsterSpawn(625, this.NpcDictionary[103], 93, 132, Direction.SouthEast);
yield return this.CreateMonsterSpawn(626, this.NpcDictionary[103], 82, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(627, this.NpcDictionary[103], 83, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(628, this.NpcDictionary[103], 84, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(629, this.NpcDictionary[103], 85, 175, Direction.SouthEast);
yield return this.CreateMonsterSpawn(630, this.NpcDictionary[103], 82, 184, Direction.SouthEast);
yield return this.CreateMonsterSpawn(631, this.NpcDictionary[103], 83, 184, Direction.SouthEast);
yield return this.CreateMonsterSpawn(632, this.NpcDictionary[103], 84, 184, Direction.SouthEast);
yield return this.CreateMonsterSpawn(633, this.NpcDictionary[103], 82, 201, Direction.SouthEast);
yield return this.CreateMonsterSpawn(634, this.NpcDictionary[103], 83, 201, Direction.SouthEast);
yield return this.CreateMonsterSpawn(635, this.NpcDictionary[103], 84, 201, Direction.SouthEast);
yield return this.CreateMonsterSpawn(636, this.NpcDictionary[103], 93, 243, Direction.SouthEast);
yield return this.CreateMonsterSpawn(637, this.NpcDictionary[103], 93, 244, Direction.SouthEast);
yield return this.CreateMonsterSpawn(638, this.NpcDictionary[103], 93, 245, Direction.SouthEast);
yield return this.CreateMonsterSpawn(639, this.NpcDictionary[103], 93, 246, Direction.SouthEast);
yield return this.CreateMonsterSpawn(640, this.NpcDictionary[103], 100, 185, Direction.SouthEast);
yield return this.CreateMonsterSpawn(641, this.NpcDictionary[103], 101, 185, Direction.SouthEast);
yield return this.CreateMonsterSpawn(642, this.NpcDictionary[103], 102, 185, Direction.SouthEast);
yield return this.CreateMonsterSpawn(643, this.NpcDictionary[103], 103, 185, Direction.SouthEast);
yield return this.CreateMonsterSpawn(644, this.NpcDictionary[103], 98, 225, Direction.SouthEast);
yield return this.CreateMonsterSpawn(645, this.NpcDictionary[103], 99, 225, Direction.SouthEast);
yield return this.CreateMonsterSpawn(646, this.NpcDictionary[103], 100, 225, Direction.SouthEast);
yield return this.CreateMonsterSpawn(647, this.NpcDictionary[103], 101, 225, Direction.SouthEast);
yield return this.CreateMonsterSpawn(648, this.NpcDictionary[103], 111, 227, Direction.SouthEast);
yield return this.CreateMonsterSpawn(649, this.NpcDictionary[103], 110, 227, Direction.SouthEast);
yield return this.CreateMonsterSpawn(650, this.NpcDictionary[103], 107, 242, Direction.SouthEast);
yield return this.CreateMonsterSpawn(651, this.NpcDictionary[103], 107, 243, Direction.SouthEast);
yield return this.CreateMonsterSpawn(652, this.NpcDictionary[103], 107, 244, Direction.SouthEast);
yield return this.CreateMonsterSpawn(653, this.NpcDictionary[103], 126, 104, Direction.SouthEast);
yield return this.CreateMonsterSpawn(654, this.NpcDictionary[103], 126, 105, Direction.SouthEast);
yield return this.CreateMonsterSpawn(655, this.NpcDictionary[103], 126, 106, Direction.SouthEast);
yield return this.CreateMonsterSpawn(656, this.NpcDictionary[103], 126, 107, Direction.SouthEast);
yield return this.CreateMonsterSpawn(657, this.NpcDictionary[103], 126, 115, Direction.SouthEast);
yield return this.CreateMonsterSpawn(658, this.NpcDictionary[103], 127, 115, Direction.SouthEast);
yield return this.CreateMonsterSpawn(659, this.NpcDictionary[103], 125, 115, Direction.SouthEast);
yield return this.CreateMonsterSpawn(660, this.NpcDictionary[103], 123, 135, Direction.SouthEast);
yield return this.CreateMonsterSpawn(661, this.NpcDictionary[103], 123, 134, Direction.SouthEast);
yield return this.CreateMonsterSpawn(662, this.NpcDictionary[103], 123, 133, Direction.SouthEast);
yield return this.CreateMonsterSpawn(663, this.NpcDictionary[103], 123, 132, Direction.SouthEast);
yield return this.CreateMonsterSpawn(664, this.NpcDictionary[103], 121, 208, Direction.SouthEast);
yield return this.CreateMonsterSpawn(665, this.NpcDictionary[103], 122, 208, Direction.SouthEast);
yield return this.CreateMonsterSpawn(666, this.NpcDictionary[103], 120, 208, Direction.SouthEast);
yield return this.CreateMonsterSpawn(667, this.NpcDictionary[103], 112, 227, Direction.SouthEast);
yield return this.CreateMonsterSpawn(668, this.NpcDictionary[103], 113, 227, Direction.SouthEast);
yield return this.CreateMonsterSpawn(669, this.NpcDictionary[103], 132, 126, Direction.SouthEast);
yield return this.CreateMonsterSpawn(670, this.NpcDictionary[103], 133, 126, Direction.SouthEast);
yield return this.CreateMonsterSpawn(671, this.NpcDictionary[103], 134, 126, Direction.SouthEast);
yield return this.CreateMonsterSpawn(672, this.NpcDictionary[103], 132, 178, Direction.SouthEast);
yield return this.CreateMonsterSpawn(673, this.NpcDictionary[103], 133, 178, Direction.SouthEast);
yield return this.CreateMonsterSpawn(674, this.NpcDictionary[103], 128, 221, Direction.SouthEast);
yield return this.CreateMonsterSpawn(675, this.NpcDictionary[103], 129, 221, Direction.SouthEast);
yield return this.CreateMonsterSpawn(676, this.NpcDictionary[103], 130, 221, Direction.SouthEast);
yield return this.CreateMonsterSpawn(677, this.NpcDictionary[103], 202, 45, Direction.SouthEast);
yield return this.CreateMonsterSpawn(678, this.NpcDictionary[103], 202, 46, Direction.SouthEast);
yield return this.CreateMonsterSpawn(679, this.NpcDictionary[103], 202, 47, Direction.SouthEast);
yield return this.CreateMonsterSpawn(680, this.NpcDictionary[103], 196, 62, Direction.SouthEast);
yield return this.CreateMonsterSpawn(681, this.NpcDictionary[103], 198, 62, Direction.SouthEast);
yield return this.CreateMonsterSpawn(682, this.NpcDictionary[103], 197, 62, Direction.SouthEast);
yield return this.CreateMonsterSpawn(683, this.NpcDictionary[103], 199, 62, Direction.SouthEast);
yield return this.CreateMonsterSpawn(684, this.NpcDictionary[103], 196, 58, Direction.SouthEast);
yield return this.CreateMonsterSpawn(685, this.NpcDictionary[103], 196, 57, Direction.SouthEast);
yield return this.CreateMonsterSpawn(686, this.NpcDictionary[103], 196, 56, Direction.SouthEast);
yield return this.CreateMonsterSpawn(687, this.NpcDictionary[103], 202, 48, Direction.SouthEast);
yield return this.CreateMonsterSpawn(688, this.NpcDictionary[103], 219, 234, Direction.SouthWest);
yield return this.CreateMonsterSpawn(689, this.NpcDictionary[103], 219, 235, Direction.SouthWest);
yield return this.CreateMonsterSpawn(690, this.NpcDictionary[103], 219, 236, Direction.SouthWest);
yield return this.CreateMonsterSpawn(691, this.NpcDictionary[103], 219, 237, Direction.SouthWest);
yield return this.CreateMonsterSpawn(692, this.NpcDictionary[103], 226, 115, Direction.SouthEast);
yield return this.CreateMonsterSpawn(693, this.NpcDictionary[103], 226, 116, Direction.SouthEast);
yield return this.CreateMonsterSpawn(694, this.NpcDictionary[103], 226, 117, Direction.SouthEast);
yield return this.CreateMonsterSpawn(695, this.NpcDictionary[103], 226, 233, Direction.SouthWest);
yield return this.CreateMonsterSpawn(696, this.NpcDictionary[103], 227, 233, Direction.SouthWest);
yield return this.CreateMonsterSpawn(697, this.NpcDictionary[103], 228, 233, Direction.SouthWest);
}
/// <inheritdoc/>
protected override void CreateMonsters()
{
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 34;
monster.Designation = "Cursed Wizard";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Meteorite);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 54 },
{ Stats.MaximumHealth, 4000 },
{ Stats.MinimumPhysBaseDmg, 160 },
{ Stats.MaximumPhysBaseDmg, 170 },
{ Stats.DefenseBase, 95 },
{ Stats.AttackRatePvm, 270 },
{ Stats.DefenseRatePvm, 80 },
{ Stats.PoisonResistance, 5f / 255 },
{ Stats.IceResistance, 5f / 255 },
{ Stats.WaterResistance, 7f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 35;
monster.Designation = "Death Gorgon";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.MonsterSkill);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 64 },
{ Stats.MaximumHealth, 6000 },
{ Stats.MinimumPhysBaseDmg, 200 },
{ Stats.MaximumPhysBaseDmg, 210 },
{ Stats.DefenseBase, 130 },
{ Stats.AttackRatePvm, 320 },
{ Stats.DefenseRatePvm, 94 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 6f / 255 },
{ Stats.WaterResistance, 6f / 255 },
{ Stats.FireResistance, 8f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 36;
monster.Designation = "Shadow";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 47 },
{ Stats.MaximumHealth, 2800 },
{ Stats.MinimumPhysBaseDmg, 148 },
{ Stats.MaximumPhysBaseDmg, 153 },
{ Stats.DefenseBase, 78 },
{ Stats.AttackRatePvm, 235 },
{ Stats.DefenseRatePvm, 67 },
{ Stats.PoisonResistance, 3f / 255 },
{ Stats.IceResistance, 3f / 255 },
{ Stats.WaterResistance, 3f / 255 },
{ Stats.FireResistance, 5f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 37;
monster.Designation = "Devil";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2000 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Lightning);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 60 },
{ Stats.MaximumHealth, 5000 },
{ Stats.MinimumPhysBaseDmg, 180 },
{ Stats.MaximumPhysBaseDmg, 195 },
{ Stats.DefenseBase, 115 },
{ Stats.AttackRatePvm, 300 },
{ Stats.DefenseRatePvm, 88 },
{ Stats.PoisonResistance, 5f / 255 },
{ Stats.IceResistance, 5f / 255 },
{ Stats.WaterResistance, 5f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 38;
monster.Designation = "Balrog";
monster.MoveRange = 3;
monster.AttackRange = 2;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(150 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.MonsterSkill);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 66 },
{ Stats.MaximumHealth, 9000 },
{ Stats.MinimumPhysBaseDmg, 220 },
{ Stats.MaximumPhysBaseDmg, 240 },
{ Stats.DefenseBase, 160 },
{ Stats.AttackRatePvm, 330 },
{ Stats.DefenseRatePvm, 99 },
{ Stats.PoisonResistance, 10f / 255 },
{ Stats.IceResistance, 10f / 255 },
{ Stats.WaterResistance, 10f / 255 },
{ Stats.FireResistance, 15f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 39;
monster.Designation = "Poison Shadow";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
monster.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.Poison);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 50 },
{ Stats.MaximumHealth, 3500 },
{ Stats.MinimumPhysBaseDmg, 155 },
{ Stats.MaximumPhysBaseDmg, 160 },
{ Stats.DefenseBase, 85 },
{ Stats.AttackRatePvm, 250 },
{ Stats.DefenseRatePvm, 73 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 4f / 255 },
{ Stats.WaterResistance, 4f / 255 },
{ Stats.FireResistance, 6f / 255 },
{ Stats.PoisonDamageMultiplier, 0.03f },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 40;
monster.Designation = "Death Knight";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1800 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 62 },
{ Stats.MaximumHealth, 5500 },
{ Stats.MinimumPhysBaseDmg, 190 },
{ Stats.MaximumPhysBaseDmg, 200 },
{ Stats.DefenseBase, 120 },
{ Stats.AttackRatePvm, 310 },
{ Stats.DefenseRatePvm, 91 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 6f / 255 },
{ Stats.WaterResistance, 6f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 41;
monster.Designation = "Death Cow";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 7;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 57 },
{ Stats.MaximumHealth, 4500 },
{ Stats.MinimumPhysBaseDmg, 170 },
{ Stats.MaximumPhysBaseDmg, 180 },
{ Stats.DefenseBase, 110 },
{ Stats.AttackRatePvm, 285 },
{ Stats.DefenseRatePvm, 85 },
{ Stats.PoisonResistance, 5f / 255 },
{ Stats.IceResistance, 5f / 255 },
{ Stats.WaterResistance, 5f / 255 },
{ Stats.FireResistance, 7f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var trap = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(trap);
trap.Number = 103;
trap.Designation = "Meteorite Trap";
trap.MoveRange = 0;
trap.AttackRange = 3;
trap.ViewRange = 1;
trap.MoveDelay = new TimeSpan(500 * TimeSpan.TicksPerMillisecond);
trap.AttackDelay = new TimeSpan(1000 * TimeSpan.TicksPerMillisecond);
trap.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
trap.ObjectKind = NpcObjectKind.Trap;
trap.IntelligenceTypeName = typeof(AttackAreaWhenPressedTrapIntelligence).FullName;
trap.Attribute = 1;
trap.NumberOfMaximumItemDrops = 0;
trap.AttackSkill = this.GameConfiguration.Skills.FirstOrDefault(s => s.Number == (short)SkillNumber.FlameofEvil);
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 90 },
{ Stats.MaximumHealth, 1000 },
{ Stats.MinimumPhysBaseDmg, 160 },
{ Stats.MaximumPhysBaseDmg, 190 },
{ Stats.AttackRatePvm, 450 },
{ Stats.DefenseRatePvm, 500 },
};
trap.AddAttributes(attributes, this.Context, this.GameConfiguration);
}
}
}

View File

@@ -0,0 +1,295 @@
// <copyright file="Noria.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.Version075.Maps;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
/// <summary>
/// The initialization for the Noria map.
/// </summary>
internal class Noria : BaseMapInitializer
{
/// <summary>
/// The default number of the map.
/// </summary>
internal const byte Number = 3;
/// <summary>
/// The default name of the map.
/// </summary>
internal const string Name = "Noria";
/// <summary>
/// Initializes a new instance of the <see cref="Noria"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public Noria(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc/>
protected override byte MapNumber => Number;
/// <inheritdoc/>
protected override string MapName => Name;
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateNpcSpawns()
{
yield return this.CreateMonsterSpawn(1, this.NpcDictionary[253], 169, 109, Direction.SouthEast);
yield return this.CreateMonsterSpawn(2, this.NpcDictionary[253], 193, 110, Direction.South);
yield return this.CreateMonsterSpawn(3, this.NpcDictionary[242], 173, 125, Direction.SouthWest);
yield return this.CreateMonsterSpawn(4, this.NpcDictionary[243], 195, 124, Direction.South);
yield return this.CreateMonsterSpawn(5, this.NpcDictionary[240], 172, 96, Direction.SouthEast);
yield return this.CreateMonsterSpawn(6, this.NpcDictionary[238], 180, 103, Direction.SouthWest);
}
/// <inheritdoc/>
protected override IEnumerable<MonsterSpawnArea> CreateMonsterSpawns()
{
yield return this.CreateMonsterSpawn(21, this.NpcDictionary[26], 128, 251, 0, 128, 155);
yield return this.CreateMonsterSpawn(22, this.NpcDictionary[27], 128, 251, 0, 128, 125);
yield return this.CreateMonsterSpawn(23, this.NpcDictionary[28], 0, 128, 0, 128, 125);
yield return this.CreateMonsterSpawn(24, this.NpcDictionary[29], 0, 128, 0, 128, 125);
yield return this.CreateMonsterSpawn(25, this.NpcDictionary[30], 0, 251, 128, 245, 125);
yield return this.CreateMonsterSpawn(26, this.NpcDictionary[31], 0, 251, 128, 245, 125);
yield return this.CreateMonsterSpawn(27, this.NpcDictionary[32], 128, 251, 128, 245, 100);
yield return this.CreateMonsterSpawn(28, this.NpcDictionary[33], 0, 128, 128, 245, 125);
}
/// <inheritdoc/>
protected override void CreateMonsters()
{
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 26;
monster.Designation = "Goblin";
monster.MoveRange = 2;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1800 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 3 },
{ Stats.MaximumHealth, 45 },
{ Stats.MinimumPhysBaseDmg, 7 },
{ Stats.MaximumPhysBaseDmg, 10 },
{ Stats.DefenseBase, 2 },
{ Stats.AttackRatePvm, 13 },
{ Stats.DefenseRatePvm, 2 },
{ Stats.WindResistance, 0f / 255 },
{ Stats.PoisonResistance, 0f / 255 },
{ Stats.IceResistance, 0f / 255 },
{ Stats.WaterResistance, 0f / 255 },
{ Stats.FireResistance, 0f / 255 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 27;
monster.Designation = "Chain Scorpion";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1800 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 5 },
{ Stats.MaximumHealth, 80 },
{ Stats.MinimumPhysBaseDmg, 13 },
{ Stats.MaximumPhysBaseDmg, 17 },
{ Stats.DefenseBase, 4 },
{ Stats.AttackRatePvm, 23 },
{ Stats.DefenseRatePvm, 4 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 28;
monster.Designation = "Beetle Monster";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 10 },
{ Stats.MaximumHealth, 165 },
{ Stats.MinimumPhysBaseDmg, 26 },
{ Stats.MaximumPhysBaseDmg, 31 },
{ Stats.DefenseBase, 10 },
{ Stats.AttackRatePvm, 44 },
{ Stats.DefenseRatePvm, 10 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 29;
monster.Designation = "Hunter";
monster.MoveRange = 3;
monster.AttackRange = 4;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 13 },
{ Stats.MaximumHealth, 220 },
{ Stats.MinimumPhysBaseDmg, 36 },
{ Stats.MaximumPhysBaseDmg, 41 },
{ Stats.DefenseBase, 13 },
{ Stats.AttackRatePvm, 56 },
{ Stats.DefenseRatePvm, 13 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 30;
monster.Designation = "Forest Monster";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 15 },
{ Stats.MaximumHealth, 295 },
{ Stats.MinimumPhysBaseDmg, 46 },
{ Stats.MaximumPhysBaseDmg, 51 },
{ Stats.DefenseBase, 15 },
{ Stats.AttackRatePvm, 68 },
{ Stats.DefenseRatePvm, 15 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 31;
monster.Designation = "Agon";
monster.MoveRange = 2;
monster.AttackRange = 1;
monster.ViewRange = 4;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1400 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 16 },
{ Stats.MaximumHealth, 340 },
{ Stats.MinimumPhysBaseDmg, 51 },
{ Stats.MaximumPhysBaseDmg, 57 },
{ Stats.DefenseBase, 16 },
{ Stats.AttackRatePvm, 74 },
{ Stats.DefenseRatePvm, 16 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 32;
monster.Designation = "Stone Golem";
monster.MoveRange = 2;
monster.AttackRange = 2;
monster.ViewRange = 3;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(2200 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 18 },
{ Stats.MaximumHealth, 465 },
{ Stats.MinimumPhysBaseDmg, 62 },
{ Stats.MaximumPhysBaseDmg, 68 },
{ Stats.DefenseBase, 20 },
{ Stats.AttackRatePvm, 86 },
{ Stats.DefenseRatePvm, 20 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
{
var monster = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(monster);
monster.Number = 33;
monster.Designation = "Elite Goblin";
monster.MoveRange = 3;
monster.AttackRange = 1;
monster.ViewRange = 5;
monster.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
monster.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
monster.RespawnDelay = new TimeSpan(10 * TimeSpan.TicksPerSecond);
monster.Attribute = 2;
monster.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 8 },
{ Stats.MaximumHealth, 120 },
{ Stats.MinimumPhysBaseDmg, 19 },
{ Stats.MaximumPhysBaseDmg, 23 },
{ Stats.DefenseBase, 8 },
{ Stats.AttackRatePvm, 33 },
{ Stats.DefenseRatePvm, 8 },
};
monster.AddAttributes(attributes, this.Context, this.GameConfiguration);
monster.SetGuid(monster.Number);
}
}
}

View File

@@ -0,0 +1,453 @@
// <copyright file="MerchantStores.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.Version075;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.Persistence.Initialization.Items;
/// <summary>
/// The initialization of all NPCs, which are no monsters.
/// </summary>
internal partial class NpcInitialization
{
/// <summary>
/// Creates the merchant store of 'Potion Girl'.
/// </summary>
/// <param name="number">The number.</param>
/// <returns>
/// The created store.
/// </returns>
protected virtual ItemStorage CreatePotionGirlItemStorage(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreatePotion(0, 0, 1, 0), // Apple +0 x1
this.ItemHelper.CreatePotion(8, 0, 3, 0), // Apple +0 x3
this.ItemHelper.CreatePotion(1, 1, 1, 0), // Small Healing Potion +0 x1
this.ItemHelper.CreatePotion(9, 1, 3, 0), // Small Healing Potion +0 x3
this.ItemHelper.CreatePotion(2, 2, 1, 0), // Medium Healing Potion +0 x1
this.ItemHelper.CreatePotion(10, 2, 3, 0), // Medium Healing Potion +0 x3
this.ItemHelper.CreatePotion(3, 3, 1, 0), // Large Healing Potion +0 x1
this.ItemHelper.CreatePotion(11, 3, 3, 0), // Large Healing Potion +0 x3
this.ItemHelper.CreatePotion(4, 4, 1, 0), // Small Mana Potion +0 x1
this.ItemHelper.CreatePotion(12, 4, 3, 0), // Small Mana Potion +0 x3
this.ItemHelper.CreatePotion(5, 5, 1, 0), // Medium Mana Potion +0 x1
this.ItemHelper.CreatePotion(13, 5, 3, 0), // Medium Mana Potion +0 x3
this.ItemHelper.CreatePotion(6, 6, 1, 0), // Large Mana Potion +0 x1
this.ItemHelper.CreatePotion(14, 6, 3, 0), // Large Mana Potion +0 x3
this.ItemHelper.CreatePotion(7, 8, 1, 0), // Antidote +0 x1
this.ItemHelper.CreatePotion(15, 8, 3, 0), // Antidote +0 x3
this.ItemHelper.CreateWeapon(16, ItemGroups.Bows, 7, 0, 0, false, false, null), // Bolt
this.ItemHelper.CreateWeapon(17, ItemGroups.Bows, 15, 0, 0, false, false, null), // Arrow
this.ItemHelper.CreateItem(18, 10, 14, 1, 0), // Town Portal Scroll
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the wandering merchant store.
/// </summary>
/// <param name="number">The number.</param>
/// <returns>
/// The created store.
/// </returns>
protected virtual ItemStorage CreateWanderingMerchant(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreateSetItem(0, 5, ItemGroups.Helm, null, 0, 1, true), // Leather Helm +0+4+L
this.ItemHelper.CreateSetItem(16, 5, ItemGroups.Armor, null, 0, 1, true), // Leather Armor +0+4+L
this.ItemHelper.CreateSetItem(40, 5, ItemGroups.Pants, null, 0, 1, true), // Leather Pants +0+4+L
this.ItemHelper.CreateSetItem(56, 5, ItemGroups.Boots, null, 0, 1, true), // Leather Boots +0+4+L
this.ItemHelper.CreateSetItem(72, 5, ItemGroups.Gloves, null, 0, 1, true), // Leather Gloves +0+4+L
this.ItemHelper.CreateSetItem(2, 0, ItemGroups.Helm, null, 2, 1, true), // Bronze Helm +2+4+L
this.ItemHelper.CreateSetItem(18, 0, ItemGroups.Armor, null, 2, 1, true), // Bronze Armor +2+4+L
this.ItemHelper.CreateSetItem(34, 0, ItemGroups.Pants, null, 2, 1, true), // Bronze Pants +2+4+L
this.ItemHelper.CreateSetItem(50, 0, ItemGroups.Boots, null, 2, 1, true), // Bronze Boots +2+4+L
this.ItemHelper.CreateSetItem(66, 0, ItemGroups.Gloves, null, 2, 1, true), // Bronze Gloves +2+4+L
this.ItemHelper.CreateSetItem(4, 6, ItemGroups.Helm, null, 3, 1, true), // Scale Helm +3+4+L
this.ItemHelper.CreateSetItem(20, 6, ItemGroups.Armor, null, 3, 1, true), // Scale Armor +3+4+L
this.ItemHelper.CreateSetItem(36, 6, ItemGroups.Pants, null, 3, 1, true), // Scale Pants +3+4+L
this.ItemHelper.CreateSetItem(52, 6, ItemGroups.Boots, null, 3, 1, true), // Scale Boots +3+4+L
this.ItemHelper.CreateSetItem(68, 6, ItemGroups.Gloves, null, 3, 1, true), // Scale Gloves +3+4+L
this.ItemHelper.CreateSetItem(6, 8, ItemGroups.Helm, null, 3, 1, true), // Brass Helm +3+4+L
this.ItemHelper.CreateSetItem(22, 8, ItemGroups.Armor, null, 3, 1, true), // Brass Armor +3+4+L
this.ItemHelper.CreateSetItem(38, 8, ItemGroups.Pants, null, 3, 1, true), // Brass Pants +3+4+L
this.ItemHelper.CreateSetItem(54, 8, ItemGroups.Boots, null, 3, 1, true), // Brass Boots +3+4+L
this.ItemHelper.CreateSetItem(70, 8, ItemGroups.Gloves, null, 3, 1, true), // Brass Gloves +3+4+L
this.ItemHelper.CreateSetItem(88, 9, ItemGroups.Helm, null, 3, 1, true), // Plate Helm +3+4+L
this.ItemHelper.CreateSetItem(104, 9, ItemGroups.Armor, null, 3, 1, true), // Plate Armor +3+4+L
this.ItemHelper.CreateSetItem(82, 9, ItemGroups.Pants, null, 3, 1, true), // Plate Pants +3+4+L
this.ItemHelper.CreateSetItem(98, 9, ItemGroups.Boots, null, 3, 1, true), // Plate Boots +3+4+L
this.ItemHelper.CreateSetItem(84, 9, ItemGroups.Gloves, null, 3, 1, true), // Plate Gloves +3+4+L
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Hanzo the Blacksmith'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateHanzoTheBlacksmith(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreateShield(0, 0, false, null, 0, 1, true), // Small Shield +0+4+L
this.ItemHelper.CreateShield(2, 4, true, null, 1, 1, true), // Buckler +1+4+L+S
this.ItemHelper.CreateShield(4, 1, false, null, 2, 1, true), // Horn Shield +2+4+L
this.ItemHelper.CreateShield(6, 2, false, null, 3, 1, true), // Kite Shield +3+4+L
this.ItemHelper.CreateShield(16, 6, true, null, 3, 1, true), // Skull Shield +3+4+L+S
this.ItemHelper.CreateShield(18, 10, true, null, 3, 1, true), // Big Round Shield +3+4+L+S
this.ItemHelper.CreateShield(20, 9, true, null, 3, 1, true), // Plate Shield +3+4+L+S
this.ItemHelper.CreateShield(22, 7, true, null, 3, 1, true), // Spiked Shield +3+4+L+S
this.ItemHelper.CreateShield(32, 5, true, null, 3, 1, true), // Dragon Slayer +3+4+L+S
this.ItemHelper.CreateShield(34, 8, true, null, 3, 1, true), // Tower Shield +3+4+L+S
this.ItemHelper.CreateShield(36, 11, true, null, 3, 1, true), // Serpent Shield +3+4+L+S
this.ItemHelper.CreateShield(38, 12, true, null, 3, 1, true), // Bronze Shield +3+4+L+S
this.ItemHelper.CreateWeapon(48, ItemGroups.Swords, 1, 0, 1, true, false, null), // Short Sword +0+4+L
this.ItemHelper.CreateWeapon(49, ItemGroups.Axes, 1, 1, 1, true, false, null), // Hand Axe +1+4+L
this.ItemHelper.CreateWeapon(50, ItemGroups.Scepters, 1, 2, 1, true, false, null), // Mace +2+4+L
this.ItemHelper.CreateWeapon(51, ItemGroups.Swords, 2, 2, 1, true, false, null), // Rapier +2+4+L
this.ItemHelper.CreateWeapon(52, ItemGroups.Axes, 2, 2, 1, true, false, null), // Double Axe +2+4+L
this.ItemHelper.CreateWeapon(53, ItemGroups.Swords, 4, 3, 1, true, true, null), // Assassin +3+4+L
this.ItemHelper.CreateWeapon(54, ItemGroups.Scepters, 1, 3, 1, true, true, null), // Morning Star +3+4+L
this.ItemHelper.CreateWeapon(55, ItemGroups.Axes, 3, 3, 1, true, true, null), // Tomahawk +3+4+L
this.ItemHelper.CreateWeapon(72, ItemGroups.Swords, 0, 2, 1, true, false, null), // Kris +2+4+L
this.ItemHelper.CreateWeapon(73, ItemGroups.Swords, 6, 3, 1, true, true, null), // Gladius +3+4+L+S
this.ItemHelper.CreateWeapon(73, ItemGroups.Swords, 7, 3, 1, true, true, null), // Falchion +3+4+L+S
this.ItemHelper.CreateWeapon(74, ItemGroups.Swords, 8, 3, 1, true, false, null), // Serpent Sword +3+4+L
this.ItemHelper.CreateWeapon(75, ItemGroups.Swords, 5, 3, 1, true, true, null), // Blade +3+4+L+S
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Pasi the Mage'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreatePasiTheMageStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreateScroll(0, 3), // Scroll of Fire Ball
this.ItemHelper.CreateScroll(1, 10), // Scroll of Power Wave
this.ItemHelper.CreateScroll(2, 2), // Scroll of Lighting
this.ItemHelper.CreateScroll(3, 1), // Scroll of Meteorite
this.ItemHelper.CreateScroll(4, 5), // Scroll of Teleport
this.ItemHelper.CreateScroll(5, 6), // Scroll of Ice
this.ItemHelper.CreateScroll(6, 0), // Scroll of Poison
this.ItemHelper.CreateSetItem(16, 2, ItemGroups.Helm, null, 0, 1, true), // Pad Helm +0+4+L
this.ItemHelper.CreateSetItem(32, 2, ItemGroups.Armor, null, 0, 1, true), // Pad Armor +0+4+L
this.ItemHelper.CreateSetItem(48, 2, ItemGroups.Pants, null, 0, 1, true), // Pad Pants +0+4+L
this.ItemHelper.CreateSetItem(64, 2, ItemGroups.Boots, null, 0, 1, true), // Pad Boots +0+4+L
this.ItemHelper.CreateSetItem(80, 2, ItemGroups.Gloves, null, 0, 1, true), // Pad Gloves +0+4+L
this.ItemHelper.CreateSetItem(18, 4, ItemGroups.Helm, null, 2, 1, true), // Bone Helm +2+4+L
this.ItemHelper.CreateSetItem(34, 4, ItemGroups.Armor, null, 2, 1, true), // Bone Armor +2+4+L
this.ItemHelper.CreateSetItem(50, 4, ItemGroups.Pants, null, 2, 1, true), // Bone Pants +2+4+L
this.ItemHelper.CreateSetItem(66, 4, ItemGroups.Boots, null, 2, 1, true), // Bone Boots +2+4+L
this.ItemHelper.CreateSetItem(82, 4, ItemGroups.Gloves, null, 2, 1, true), // Bone Gloves +2+4+L
this.ItemHelper.CreateSetItem(20, 7, ItemGroups.Helm, null, 3, 1, true), // Sphinx Helm +3+4+L
this.ItemHelper.CreateSetItem(36, 7, ItemGroups.Armor, null, 3, 1, true), // Sphinx Armor +3+4+L
this.ItemHelper.CreateSetItem(60, 7, ItemGroups.Pants, null, 3, 1, true), // Sphinx Pants +3+4+L
this.ItemHelper.CreateSetItem(76, 7, ItemGroups.Boots, null, 3, 1, true), // Sphinx Boots +3+4+L
this.ItemHelper.CreateSetItem(92, 7, ItemGroups.Gloves, null, 3, 1, true), // Sphinx Gloves +3+4+L
this.ItemHelper.CreateWeapon(22, ItemGroups.Staff, 0, 0, 1, true, false, null), // Skull Staff +0+4+L
this.ItemHelper.CreateWeapon(46, ItemGroups.Staff, 1, 2, 1, true, false, null), // Angelic Staff +2+4+L
this.ItemHelper.CreateWeapon(70, ItemGroups.Staff, 2, 3, 1, true, false, null), // Serpent Staff +3+4+L
this.ItemHelper.CreateWeapon(94, ItemGroups.Staff, 3, 3, 1, true, false, null), // Thunder Staff +3+4+L
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Elf Lala'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateElfLalaStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreatePotion(0, 0, 1, 0), // Apple +0 x1
this.ItemHelper.CreatePotion(8, 0, 3, 0), // Apple +0 x3
this.ItemHelper.CreatePotion(1, 1, 1, 0), // Small Healing Potion +0 x1
this.ItemHelper.CreatePotion(9, 1, 3, 0), // Small Healing Potion +0 x3
this.ItemHelper.CreatePotion(2, 2, 1, 0), // Medium Healing Potion +0 x1
this.ItemHelper.CreatePotion(10, 2, 3, 0), // Medium Healing Potion +0 x3
this.ItemHelper.CreatePotion(3, 3, 1, 0), // Large Healing Potion +0 x1
this.ItemHelper.CreatePotion(11, 3, 3, 0), // Large Healing Potion +0 x3
this.ItemHelper.CreatePotion(4, 4, 1, 0), // Small Mana Potion +0 x1
this.ItemHelper.CreatePotion(12, 4, 3, 0), // Small Mana Potion +0 x3
this.ItemHelper.CreatePotion(5, 5, 1, 0), // Medium Mana Potion +0 x1
this.ItemHelper.CreatePotion(13, 5, 3, 0), // Medium Mana Potion +0 x3
this.ItemHelper.CreatePotion(6, 6, 1, 0), // Large Mana Potion +0 x1
this.ItemHelper.CreatePotion(14, 6, 3, 0), // Large Mana Potion +0 x3
this.ItemHelper.CreatePotion(7, 8, 1, 0), // Antidote +0 x1
this.ItemHelper.CreatePotion(15, 8, 3, 0), // Antidote +0 x3
this.ItemHelper.CreateOrb(16, 8),
this.ItemHelper.CreateOrb(17, 9),
this.ItemHelper.CreateOrb(18, 10),
this.ItemHelper.CreateItem(21, 10, 14, 1, 0), // Town Portal Scroll
this.ItemHelper.CreateWeapon(22, ItemGroups.Bows, 7, 0, 0, false, false, null), // Bolt
this.ItemHelper.CreateWeapon(23, ItemGroups.Bows, 15, 0, 0, false, false, null), // Arrow
this.ItemHelper.CreateSummonOrb(24, 0), // Orb of Summon "Goblin"
this.ItemHelper.CreateSummonOrb(25, 1), // Orb of Summon + 1 "Stone Golem"
this.ItemHelper.CreateSummonOrb(26, 2), // Orb of Summon + 2 "Assassin"
this.ItemHelper.CreateSummonOrb(27, 3), // Orb of Summon + 3 "Elite Yeti"
this.ItemHelper.CreateSummonOrb(28, 4), // Orb of Summon + 4 "Dark Knight"
this.ItemHelper.CreateSetItem(32, 10, ItemGroups.Helm, null, 0, 1, true), // Vine Helme +0+4+L
this.ItemHelper.CreateSetItem(34, 10, ItemGroups.Armor, null, 0, 1, true), // Vine Armor +0+4+L
this.ItemHelper.CreateSetItem(36, 10, ItemGroups.Pants, null, 0, 1, true), // Vine Pants +0+4+L
this.ItemHelper.CreateSetItem(38, 10, ItemGroups.Gloves, null, 3, 1, true), // Vine Gloves +3+4+L
this.ItemHelper.CreateSetItem(48, 10, ItemGroups.Boots, null, 3, 1, true), // Vine Boots +3+4+L
this.ItemHelper.CreateSetItem(50, 11, ItemGroups.Helm, null, 2, 1, true), // Silk Helme +2+4+L
this.ItemHelper.CreateSetItem(52, 11, ItemGroups.Armor, null, 2, 1, true), // Silk Armor +2+4+L
this.ItemHelper.CreateSetItem(54, 11, ItemGroups.Pants, null, 2, 1, true), // Silk Pants +2+4+L
this.ItemHelper.CreateSetItem(64, 11, ItemGroups.Gloves, null, 2, 1, true), // Silk Gloves +2+4+L
this.ItemHelper.CreateSetItem(66, 11, ItemGroups.Boots, null, 2, 1, true), // Silk Boots +2+4+L
this.ItemHelper.CreateSetItem(68, 12, ItemGroups.Helm, null, 3, 1, true), // Wind Helme +3+4+L
this.ItemHelper.CreateSetItem(70, 12, ItemGroups.Armor, null, 3, 1, true), // Wind Armor +3+4+L
this.ItemHelper.CreateSetItem(80, 12, ItemGroups.Pants, null, 3, 1, true), // Wind Pants +3+4+L
this.ItemHelper.CreateSetItem(82, 12, ItemGroups.Gloves, null, 3, 1, true), // Wind Gloves +3+4+L
this.ItemHelper.CreateSetItem(84, 12, ItemGroups.Boots, null, 3, 1, true), // Wind Boots +3+4+L
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Izabel the Wizard'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateIzabelTheWizardStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreatePotion(0, 0, 1, 0), // Apple +0 x1
this.ItemHelper.CreatePotion(8, 0, 3, 0), // Apple +0 x3
this.ItemHelper.CreatePotion(1, 1, 1, 0), // Small Healing Potion +0 x1
this.ItemHelper.CreatePotion(9, 1, 3, 0), // Small Healing Potion +0 x3
this.ItemHelper.CreatePotion(2, 2, 1, 0), // Medium Healing Potion +0 x1
this.ItemHelper.CreatePotion(10, 2, 3, 0), // Medium Healing Potion +0 x3
this.ItemHelper.CreatePotion(3, 3, 1, 0), // Large Healing Potion +0 x1
this.ItemHelper.CreatePotion(11, 3, 3, 0), // Large Healing Potion +0 x3
this.ItemHelper.CreatePotion(4, 4, 1, 0), // Small Mana Potion +0 x1
this.ItemHelper.CreatePotion(12, 4, 3, 0), // Small Mana Potion +0 x3
this.ItemHelper.CreatePotion(5, 5, 1, 0), // Medium Mana Potion +0 x1
this.ItemHelper.CreatePotion(13, 5, 3, 0), // Medium Mana Potion +0 x3
this.ItemHelper.CreatePotion(6, 6, 1, 0), // Large Mana Potion +0 x1
this.ItemHelper.CreatePotion(14, 6, 3, 0), // Large Mana Potion +0 x3
this.ItemHelper.CreatePotion(7, 8, 1, 0), // Antidote +0 x1
this.ItemHelper.CreatePotion(15, 8, 3, 0), // Antidote +0 x3
this.ItemHelper.CreateSetItem(16, 3, ItemGroups.Helm, null, 3, 1, true), // Legendary Helm +3+Luck+4
this.ItemHelper.CreateSetItem(18, 3, ItemGroups.Armor, null, 3, 1, true), // Legendary Armor +3+Luck+4
this.ItemHelper.CreateSetItem(20, 3, ItemGroups.Pants, null, 3, 1, true), // Legendary Pants +3+Luck+4
this.ItemHelper.CreateSetItem(22, 3, ItemGroups.Gloves, null, 3, 1, true), // Legendary Glover +3+Luck+4
this.ItemHelper.CreateSetItem(32, 3, ItemGroups.Boots, null, 3, 1, true), // Legendary Boots +3+Luck+4
this.ItemHelper.CreateItem(34, 10, 14, 1, 0), // Town Portal Scroll
this.ItemHelper.CreateWeapon(35, ItemGroups.Bows, 7, 0, 0, false, false, null), // Bolt
this.ItemHelper.CreateWeapon(36, ItemGroups.Bows, 15, 0, 0, false, false, null), // Arrow
this.ItemHelper.CreateScroll(37, 4), // Scroll of Flame
this.ItemHelper.CreateScroll(38, 7), // Scroll of Twister
this.ItemHelper.CreateWeapon(48, ItemGroups.Staff, 4, 3, 1, true, false, null), // Gordon Staff +3+Luck+4
this.ItemHelper.CreateWeapon(50, ItemGroups.Staff, 5, 3, 1, true, false, null), // Legendary Staff +3+Luck+4
this.ItemHelper.CreateWeapon(52, ItemGroups.Shields, 14, 3, 2, true, false, null), // Legendary Shield +3+Luck+5
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Eo the Craftsman'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateEoTheCraftsmanStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreateSetItem(0, 13, ItemGroups.Helm, null, 3, 1, true), // Spirit Helm +3+Luck+4
this.ItemHelper.CreateSetItem(2, 13, ItemGroups.Armor, null, 3, 1, true), // Spirit Armor +3+Luck+4
this.ItemHelper.CreateSetItem(4, 13, ItemGroups.Pants, null, 3, 1, true), // Spirit Pants +3+Luck+4
this.ItemHelper.CreateSetItem(6, 13, ItemGroups.Gloves, null, 3, 1, true), // Spirit Gloves +3+Luck+4
this.ItemHelper.CreateSetItem(16, 13, ItemGroups.Boots, null, 3, 1, true), // Spirit Boots +3+Luck+4
this.ItemHelper.CreateSetItem(18, 14, ItemGroups.Helm, null, 3, 1, true), // Guardian Helm +3+Luck+4
this.ItemHelper.CreateSetItem(20, 14, ItemGroups.Armor, null, 3, 1, true), // Guardian Armor +3+Luck+4
this.ItemHelper.CreateSetItem(22, 14, ItemGroups.Pants, null, 3, 1, true), // Guardian Pants +3+Luck+4
this.ItemHelper.CreateSetItem(32, 14, ItemGroups.Gloves, null, 3, 1, true), // Guardian Gloves +3+Luck+4
this.ItemHelper.CreateSetItem(34, 14, ItemGroups.Boots, null, 3, 1, true), // Guardian Boots +3+Luck+4
this.ItemHelper.CreateWeapon(36, ItemGroups.Bows, 8, 1, 1, true, true, null), // Crossbow +1+Skill+Luck+4
this.ItemHelper.CreateWeapon(38, ItemGroups.Bows, 9, 3, 1, true, true, null), // Golden Crossbow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(48, ItemGroups.Bows, 0, 0, 1, true, true, null), // Short Bow +0+Skill+Luck+4
this.ItemHelper.CreateWeapon(50, ItemGroups.Bows, 1, 0, 1, true, true, null), // bow +0+Skill+Luck+4
this.ItemHelper.CreateWeapon(52, ItemGroups.Bows, 2, 2, 1, true, true, null), // Elven Bow +2+Skill+Luck+4
this.ItemHelper.CreateWeapon(54, ItemGroups.Bows, 3, 3, 1, true, true, null), // Battle Bow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(72, ItemGroups.Bows, 11, 3, 1, true, true, null), // Light Crossbow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(74, ItemGroups.Bows, 4, 3, 1, true, true, null), // Tiger Bow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(76, ItemGroups.Bows, 10, 3, 1, true, true, null), // Arquebus +3+Skill+Luck+4
this.ItemHelper.CreateShield(78, 3, false, null, 3, 2, true), // Elven Shield +3+Luck+5
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Zienna'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateZiennaStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreateSetItem(0, 1, ItemGroups.Helm, null, 3, 1, true), // Dragon Helm +3+Luck+4
this.ItemHelper.CreateSetItem(2, 1, ItemGroups.Armor, null, 3, 1, true), // Dragon Armor +3+Luck+4
this.ItemHelper.CreateSetItem(4, 1, ItemGroups.Pants, null, 3, 1, true), // Dragon Pants +3+Luck+4
this.ItemHelper.CreateSetItem(6, 1, ItemGroups.Gloves, null, 3, 1, true), // Dragon Gloves +3+Luck+4
this.ItemHelper.CreateSetItem(16, 1, ItemGroups.Boots, null, 3, 1, true), // Dragon Boots +3+Luck+4
this.ItemHelper.CreateWeapon(20, ItemGroups.Swords, 9, 3, 1, true, true, null), // Sword of Salamander +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(22, ItemGroups.Swords, 11, 3, 1, true, true, null), // Legendary Sword +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(32, ItemGroups.Swords, 13, 3, 1, true, true, null), // Double Blade +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(33, ItemGroups.Swords, 14, 3, 1, true, true, null), // Lighting Sword +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(26, ItemGroups.Swords, 15, 3, 1, true, true, null), // Giant Sword +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(44, ItemGroups.Swords, 12, 3, 1, true, true, null), // Heliacal Sword +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(46, ItemGroups.Bows, 12, 3, 1, true, true, null), // Serpent Crossbow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(56, ItemGroups.Spears, 9, 3, 1, true, true, null), // Bill of Balrog +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(50, ItemGroups.Spears, 8, 3, 1, true, true, null), // Great Scythe +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(68, ItemGroups.Bows, 5, 3, 1, true, true, null), // Silver Bow +3+Skill+Luck+4
this.ItemHelper.CreateWeapon(70, ItemGroups.Bows, 13, 3, 1, true, true, null), // Bluewing Crossbow +3+Skill+Luck+4
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Lumen the Barmaid'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateLumenTheBarmaidStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreatePotion(0, 9, 1, 0), // Ale
this.ItemHelper.CreateItem(1, 10, 14, 1, 0), // Town Portal Scroll
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store of 'Carmen the Barmaid'.
/// </summary>
/// <param name="number">The number of the store.</param>
/// <returns>The created store.</returns>
protected virtual ItemStorage CreateCarenTheBarmaidStore(short number)
{
List<Item> itemList = new()
{
this.ItemHelper.CreatePotion(0, 9, 1, 0), // Ale
this.ItemHelper.CreateItem(1, 10, 14, 1, 0), // Town Portal Scroll
};
var storage = this.CreateMerchantStore(itemList);
storage.SetGuid(number);
return storage;
}
/// <summary>
/// Creates the merchant store with the specified item list.
/// </summary>
/// <param name="itemList">The item list.</param>
/// <returns>The created store.</returns>
protected ItemStorage CreateMerchantStore(IEnumerable<Item> itemList)
{
var merchantStore = this.Context.CreateNew<ItemStorage>();
foreach (var item in itemList)
{
merchantStore.Items.Add(item);
}
return merchantStore;
}
}

View File

@@ -0,0 +1,272 @@
// <copyright file="NpcInitialization.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.Version075;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.GameLogic.NPC;
using MUnique.OpenMU.Persistence.Initialization.Items;
/// <summary>
/// The initialization of all NPCs, which are no monsters.
/// </summary>
internal partial class NpcInitialization : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="NpcInitialization" /> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public NpcInitialization(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
this.ItemHelper = new ItemHelper(this.Context, this.GameConfiguration);
}
/// <summary>
/// Gets the item helper.
/// </summary>
protected ItemHelper ItemHelper { get; }
/// <summary>
/// Creates all NPCs.
/// </summary>
/// <remarks>
/// Extracted from Monsters.txt by Regex: (?m)^(\d+)\t1\t"(.*?)".*?$
/// Replace by: yield return new MonsterDefinition() { Number = $1, Designation="$2" };
/// yield return new (\w*) { Number = (\d+), Designation = (".*?").*?(, NpcWindow = (.*) ){0,1}};
/// Replace by: <![CDATA[ {\n var def = this.Context.CreateNew<$1>();\n def.Number = $2;\n def.Designation = $3;\n def.NpcWindow = $5;\n this.GameConfiguration.Monsters.Add(def);\n}\n ]]>.
/// </remarks>
public override void Initialize()
{
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 238;
def.Designation = "Chaos Goblin";
def.NpcWindow = NpcWindow.ChaosMachine;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 239;
def.Designation = "Arena Guard";
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 240;
def.Designation = "Baz The Vault Keeper";
def.NpcWindow = NpcWindow.VaultStorage;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 241;
def.Designation = "Guild Master";
def.NpcWindow = NpcWindow.GuildMaster;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 242;
def.Designation = "Elf Lala";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateElfLalaStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 243;
def.Designation = "Eo the Craftsman";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateEoTheCraftsmanStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 244;
def.Designation = "Caren the Barmaid";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateCarenTheBarmaidStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 245;
def.Designation = "Izabel The Wizard";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateIzabelTheWizardStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 246;
def.Designation = "Zienna The Weapons Merchant";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateZiennaStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 247;
def.Designation = "Crossbow Guard";
def.ObjectKind = NpcObjectKind.Guard;
def.MoveRange = 3;
def.AttackRange = 5;
def.ViewRange = 7;
def.IntelligenceTypeName = typeof(GuardIntelligence).FullName;
def.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
def.AttackDelay = new TimeSpan(1500 * TimeSpan.TicksPerMillisecond);
def.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
def.NumberOfMaximumItemDrops = 0;
def.Attribute = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 90 },
{ Stats.MaximumHealth, 10000 },
{ Stats.MinimumPhysBaseDmg, 180 },
{ Stats.MaximumPhysBaseDmg, 195 },
{ Stats.AttackRatePvm, 300 },
{ Stats.DefenseRatePvm, 100 },
{ Stats.DefenseBase, 70 },
};
def.AddAttributes(attributes, this.Context, this.GameConfiguration);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 248;
def.Designation = "Wandering Merchant Martin";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateWanderingMerchant(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 249;
def.Designation = "Berdysh Guard";
def.ObjectKind = NpcObjectKind.Guard;
def.MoveRange = 3;
def.AttackRange = 2;
def.ViewRange = 7;
def.IntelligenceTypeName = typeof(GuardIntelligence).FullName;
def.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
def.AttackDelay = new TimeSpan(1500 * TimeSpan.TicksPerMillisecond);
def.RespawnDelay = new TimeSpan(3 * TimeSpan.TicksPerSecond);
def.NumberOfMaximumItemDrops = 0;
def.Attribute = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 90 },
{ Stats.MaximumHealth, 10000 },
{ Stats.MinimumPhysBaseDmg, 180 },
{ Stats.MaximumPhysBaseDmg, 195 },
{ Stats.AttackRatePvm, 300 },
{ Stats.DefenseRatePvm, 100 },
{ Stats.DefenseBase, 70 },
};
def.AddAttributes(attributes, this.Context, this.GameConfiguration);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 250;
def.Designation = "Wandering Merchant Harold";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateWanderingMerchant(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 251;
def.Designation = "Hanzo The Blacksmith";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateHanzoTheBlacksmith(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 253;
def.Designation = "Potion Girl Amy";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreatePotionGirlItemStorage(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 254;
def.Designation = "Pasi The Mage";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreatePasiTheMageStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 255;
def.Designation = "Lumen the Barmaid";
def.NpcWindow = NpcWindow.Merchant;
def.ObjectKind = NpcObjectKind.PassiveNpc;
def.MerchantStore = this.CreateLumenTheBarmaidStore(def.Number);
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
{
var def = this.Context.CreateNew<MonsterDefinition>();
def.Number = 200;
def.Designation = "Soccerball";
def.ObjectKind = NpcObjectKind.SoccerBall;
def.SetGuid(def.Number);
this.GameConfiguration.Monsters.Add(def);
}
}
}

View File

@@ -0,0 +1,144 @@
// <copyright file="SkillsInitializer.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.Version075;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
using MUnique.OpenMU.Persistence.Initialization.Skills;
/// <summary>
/// Initialization logic for <see cref="Skill"/>s.
/// </summary>
internal class SkillsInitializer : SkillsInitializerBase
{
private static readonly IDictionary<SkillNumber, MagicEffectNumber> EffectsOfSkills = new Dictionary<SkillNumber, MagicEffectNumber>
{
{ SkillNumber.Defense, MagicEffectNumber.ShieldSkill },
{ SkillNumber.GreaterDefense, MagicEffectNumber.GreaterDefense },
{ SkillNumber.GreaterDamage, MagicEffectNumber.GreaterDamage },
{ SkillNumber.Heal, MagicEffectNumber.Heal },
};
/// <summary>
/// Initializes a new instance of the <see cref="SkillsInitializer"/> class.
/// </summary>
/// <param name="context">The persistence context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public SkillsInitializer(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <summary>
/// Initializes this instance.
/// </summary>
public override void Initialize()
{
this.CreateSkill(SkillNumber.Poison, "Poison", CharacterClasses.DarkWizard, DamageType.Wizardry, 12, 6, manaConsumption: 42, energyRequirement: 140, elementalModifier: ElementalType.Poison);
this.CreateSkill(SkillNumber.Meteorite, "Meteorite", CharacterClasses.DarkWizard, DamageType.Wizardry, 21, 6, manaConsumption: 12, energyRequirement: 104, elementalModifier: ElementalType.Earth);
this.CreateSkill(SkillNumber.Lightning, "Lightning", CharacterClasses.DarkWizard, DamageType.Wizardry, 17, 6, manaConsumption: 15, energyRequirement: 72, elementalModifier: ElementalType.Lightning);
this.CreateSkill(SkillNumber.FireBall, "Fire Ball", CharacterClasses.DarkWizard, DamageType.Wizardry, 8, 6, manaConsumption: 3, energyRequirement: 40, elementalModifier: ElementalType.Fire);
this.CreateSkill(SkillNumber.Flame, "Flame", CharacterClasses.DarkWizard, DamageType.Wizardry, 25, 6, manaConsumption: 50, energyRequirement: 160, elementalModifier: ElementalType.Fire, skillType: SkillType.AreaSkillAutomaticHits);
this.AddAreaSkillSettings(SkillNumber.Flame, false, default, default, default, true, TimeSpan.Zero, TimeSpan.FromMilliseconds(500), 0, 2, default, default, 0.5f, targetAreaDiameter: 2, useTargetAreaFilter: true);
this.CreateSkill(SkillNumber.Teleport, "Teleport", CharacterClasses.DarkWizard, DamageType.Wizardry, distance: 6, manaConsumption: 30, energyRequirement: 88, skillType: SkillType.Other);
this.CreateSkill(SkillNumber.Ice, "Ice", CharacterClasses.DarkWizard, DamageType.Wizardry, 10, 6, manaConsumption: 38, energyRequirement: 120, elementalModifier: ElementalType.Ice);
this.CreateSkill(SkillNumber.Twister, "Twister", CharacterClasses.DarkWizard, DamageType.Wizardry, 35, 6, manaConsumption: 60, energyRequirement: 180, elementalModifier: ElementalType.Wind, skillType: SkillType.AreaSkillAutomaticHits);
this.AddAreaSkillSettings(SkillNumber.Twister, true, 1.5f, 1.5f, 4f, true, TimeSpan.FromMilliseconds(300), TimeSpan.FromMilliseconds(1000), 0, 2, default, default, 0.7f);
this.CreateSkill(SkillNumber.EvilSpirit, "Evil Spirit", CharacterClasses.DarkWizard, DamageType.Wizardry, 45, 7, manaConsumption: 90, energyRequirement: 220, skillType: SkillType.AreaSkillAutomaticHits);
this.AddAreaSkillSettings(SkillNumber.EvilSpirit, false, default, default, default, true, TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(1000), 0, 2, default, default, 0.7f);
this.CreateSkill(SkillNumber.Hellfire, "Hellfire", CharacterClasses.DarkWizard, DamageType.Wizardry, 120, manaConsumption: 160, energyRequirement: 260, elementalModifier: ElementalType.Fire, skillType: SkillType.AreaSkillAutomaticHits);
this.CreateSkill(SkillNumber.PowerWave, "Power Wave", CharacterClasses.DarkWizard, DamageType.Wizardry, 14, 6, manaConsumption: 5, energyRequirement: 56);
this.CreateSkill(SkillNumber.AquaBeam, "Aqua Beam", CharacterClasses.DarkWizard, DamageType.Wizardry, 80, 6, manaConsumption: 140, energyRequirement: 345, elementalModifier: ElementalType.Water, skillType: SkillType.AreaSkillAutomaticHits);
this.AddAreaSkillSettings(SkillNumber.AquaBeam, true, 1.5f, 1.5f, 8f);
this.CreateSkill(SkillNumber.EnergyBall, "Energy Ball", CharacterClasses.DarkWizard, DamageType.Wizardry, 3, 6, manaConsumption: 1);
this.CreateSkill(SkillNumber.Defense, "Defense", CharacterClasses.DarkKnight, manaConsumption: 30, skillType: SkillType.Buff, skillTarget: SkillTarget.Explicit, implicitTargetRange: 0, targetRestriction: SkillTargetRestriction.Self);
this.CreateSkill(SkillNumber.FallingSlash, "Falling Slash", CharacterClasses.DarkKnight, DamageType.Physical, distance: 3, manaConsumption: 9, movesToTarget: true, movesTarget: true);
this.CreateSkill(SkillNumber.Lunge, "Lunge", CharacterClasses.DarkKnight, DamageType.Physical, distance: 2, manaConsumption: 9, movesToTarget: true, movesTarget: true);
this.CreateSkill(SkillNumber.Uppercut, "Uppercut", CharacterClasses.DarkKnight, DamageType.Physical, distance: 2, manaConsumption: 8, movesToTarget: true, movesTarget: true);
this.CreateSkill(SkillNumber.Cyclone, "Cyclone", CharacterClasses.DarkKnight, DamageType.Physical, distance: 2, manaConsumption: 9, movesToTarget: true, movesTarget: true);
this.CreateSkill(SkillNumber.Slash, "Slash", CharacterClasses.DarkKnight, DamageType.Physical, distance: 2, manaConsumption: 10, movesToTarget: true, movesTarget: true);
this.CreateSkill(SkillNumber.TripleShot, "Triple Shot", CharacterClasses.FairyElf, DamageType.Physical, distance: 6, manaConsumption: 5, skillType: SkillType.AreaSkillExplicitHits);
this.CreateSkill(SkillNumber.Heal, "Heal", CharacterClasses.FairyElf, distance: 6, manaConsumption: 20, energyRequirement: 52, skillType: SkillType.Regeneration, targetRestriction: SkillTargetRestriction.Player);
this.CreateSkill(SkillNumber.GreaterDefense, "Greater Defense", CharacterClasses.FairyElf, distance: 6, manaConsumption: 30, energyRequirement: 72, skillType: SkillType.Buff, targetRestriction: SkillTargetRestriction.Player);
this.CreateSkill(SkillNumber.GreaterDamage, "Greater Damage", CharacterClasses.FairyElf, distance: 6, manaConsumption: 40, energyRequirement: 92, skillType: SkillType.Buff, targetRestriction: SkillTargetRestriction.Player);
this.CreateSkill(SkillNumber.SummonGoblin, "Summon Goblin", CharacterClasses.FairyElf, manaConsumption: 40, energyRequirement: 30, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.SummonStoneGolem, "Summon Stone Golem", CharacterClasses.FairyElf, manaConsumption: 70, energyRequirement: 60, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.SummonAssassin, "Summon Assassin", CharacterClasses.FairyElf, manaConsumption: 110, energyRequirement: 90, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.SummonEliteYeti, "Summon Elite Yeti", CharacterClasses.FairyElf, manaConsumption: 160, energyRequirement: 130, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.SummonDarkKnight, "Summon Dark Knight", CharacterClasses.FairyElf, manaConsumption: 200, energyRequirement: 170, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.SummonBali, "Summon Bali", CharacterClasses.FairyElf, manaConsumption: 250, energyRequirement: 210, skillType: SkillType.SummonMonster);
this.CreateSkill(SkillNumber.FlameofEvil, "Flame of Evil (Monster)", damage: 120, manaConsumption: 160, levelRequirement: 60, energyRequirement: 100);
this.InitializeEffects();
this.MapSkillsToEffects();
this.CreateSpecialSummonMonsters();
this.FixMagicEffectNumbers();
}
private void FixMagicEffectNumbers()
{
foreach (var skill in this.GameConfiguration.Skills.Where(s => s.MagicEffectDef is { }))
{
var effect = skill.MagicEffectDef;
if (effect?.Number >= 0)
{
effect.Number = skill.Number;
}
}
}
private void CreateSpecialSummonMonsters()
{
var bali = this.Context.CreateNew<MonsterDefinition>();
this.GameConfiguration.Monsters.Add(bali);
bali.Number = 150;
bali.Designation = "Bali";
bali.MoveRange = 3;
bali.AttackRange = 1;
bali.ViewRange = 7;
bali.MoveDelay = new TimeSpan(400 * TimeSpan.TicksPerMillisecond);
bali.AttackDelay = new TimeSpan(1600 * TimeSpan.TicksPerMillisecond);
bali.RespawnDelay = new TimeSpan(100 * TimeSpan.TicksPerSecond);
bali.Attribute = 2;
bali.NumberOfMaximumItemDrops = 1;
var attributes = new Dictionary<AttributeDefinition, float>
{
{ Stats.Level, 52 },
{ Stats.MaximumHealth, 5000 },
{ Stats.MinimumPhysBaseDmg, 165 },
{ Stats.MaximumPhysBaseDmg, 170 },
{ Stats.DefenseBase, 100 },
{ Stats.AttackRatePvm, 260 },
{ Stats.DefenseRatePvm, 75 },
{ Stats.PoisonResistance, 6f / 255 },
{ Stats.IceResistance, 6f / 255 },
{ Stats.WaterResistance, 6f / 255 },
{ Stats.FireResistance, 6f / 255 },
};
bali.AddAttributes(attributes, this.Context, this.GameConfiguration);
}
private void InitializeEffects()
{
new DefenseEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new GreaterDamageEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new GreaterDefenseEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new HealEffectInitializer(this.Context, this.GameConfiguration).Initialize();
new AlcoholEffectInitializer(this.Context, this.GameConfiguration).Initialize();
}
private void MapSkillsToEffects()
{
foreach (var effectOfSkill in EffectsOfSkills)
{
var skill = this.GameConfiguration.Skills.First(s => s.Number == (short)effectOfSkill.Key);
var effect = this.GameConfiguration.MagicEffects.First(e => e.Number == (short)effectOfSkill.Value);
skill.MagicEffectDef = effect;
}
}
}

View File

@@ -0,0 +1,518 @@
// <copyright file="AccountInitializerBase.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.Version075.TestAccounts;
using MUnique.OpenMU.AttributeSystem;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Configuration.Items;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
using MUnique.OpenMU.Persistence.Initialization.Items;
/// <summary>
/// Abstract base class for a test account initializer.
/// </summary>
internal abstract class AccountInitializerBase : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="AccountInitializerBase"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
/// <param name="accountName">Name of the account.</param>
/// <param name="level">The level.</param>
protected AccountInitializerBase(IContext context, GameConfiguration gameConfiguration, string accountName, int level)
: base(context, gameConfiguration)
{
this.Level = level;
this.AccountName = accountName;
}
/// <summary>
/// Gets the level.
/// </summary>
/// <value>
/// The level.
/// </value>
protected int Level { get; }
/// <summary>
/// Gets the name of the account.
/// </summary>
/// <value>
/// The name of the account.
/// </value>
protected string AccountName { get; }
/// <inheritdoc />
public sealed override void Initialize()
{
this.CreateAccount();
}
/// <summary>
/// Creates the account.
/// </summary>
/// <returns>The created account.</returns>
protected virtual Account CreateAccount()
{
var account = this.Context.CreateNew<Account>();
account.LoginName = this.AccountName;
account.PasswordHash = BCrypt.Net.BCrypt.HashPassword(this.AccountName);
account.Vault = this.Context.CreateNew<ItemStorage>();
if (this.CreateKnight() is { } knight)
{
account.Characters.Add(knight);
}
if (this.CreateElf() is { } elf)
{
account.Characters.Add(elf);
}
if (this.CreateWizard() is { } wizard)
{
account.Characters.Add(wizard);
}
return account;
}
/// <summary>
/// Creates the knight.
/// </summary>
/// <returns>The dark knight, or null.</returns>
protected abstract Character? CreateKnight();
/// <summary>
/// Creates the elf.
/// </summary>
/// <returns>The elf, or null.</returns>
protected abstract Character? CreateElf();
/// <summary>
/// Creates the wizard.
/// </summary>
/// <returns>The wizard, or null.</returns>
protected abstract Character? CreateWizard();
/// <summary>
/// Creates the knight.
/// </summary>
/// <param name="characterClassNumber">The character class number.</param>
/// <returns>The created knight.</returns>
protected Character CreateKnight(CharacterClassNumber characterClassNumber)
{
return this.CreateCharacter(this.AccountName + "Dk", characterClassNumber, this.Level, 0);
}
/// <summary>
/// Creates the wizard.
/// </summary>
/// <param name="characterClassNumber">The character class number.</param>
/// <returns>The created wizard.</returns>
protected Character CreateWizard(CharacterClassNumber characterClassNumber)
{
return this.CreateCharacter(this.AccountName + "Dw", characterClassNumber, this.Level, 1);
}
/// <summary>
/// Creates the elf.
/// </summary>
/// <param name="characterClassNumber">The character class number.</param>
/// <returns>The created elf.</returns>
protected Character CreateElf(CharacterClassNumber characterClassNumber)
{
return this.CreateCharacter(this.AccountName + "Elf", characterClassNumber, this.Level, 2);
}
/// <summary>
/// Creates the character.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="characterClass">The character class.</param>
/// <param name="level">The level.</param>
/// <param name="slot">The slot.</param>
/// <returns>The created character.</returns>
protected virtual Character CreateCharacter(string name, CharacterClassNumber characterClass, int level, byte slot)
{
var character = this.Context.CreateNew<Character>();
character.CharacterClass = this.GameConfiguration.CharacterClasses.First(c => c.Number == (byte)characterClass);
character.Name = name;
character.CharacterSlot = slot;
character.CreateDate = DateTime.UtcNow;
character.KeyConfiguration = new byte[30];
foreach (
var attribute in
character.CharacterClass.StatAttributes.Select(
a => this.Context.CreateNew<StatAttribute>(a.Attribute, a.BaseValue)))
{
character.Attributes.Add(attribute);
}
character.CurrentMap = character.CharacterClass.HomeMap;
var spawnGate = character.CurrentMap!.ExitGates.Where(m => m.IsSpawnGate).SelectRandom();
if (spawnGate is not null)
{
character.PositionX = (byte)Rand.NextInt(spawnGate.X1, spawnGate.X2);
character.PositionY = (byte)Rand.NextInt(spawnGate.Y1, spawnGate.Y2);
}
else
{
throw new InvalidOperationException($"{character.CurrentMap.Name} has no spawn gate.");
}
character.Attributes.First(a => a.Definition == Stats.Level).Value = level;
character.Experience = GameConfigurationInitializerBase.CalculateNeededExperience(level);
character.LevelUpPoints = (int)((character.Attributes.First(a => a.Definition == Stats.Level).Value - 1)
* character.CharacterClass.StatAttributes.First(a => a.Attribute == Stats.PointsPerLevelUp).BaseValue);
character.Inventory = this.Context.CreateNew<ItemStorage>();
character.Inventory.Money = 10000000;
return character;
}
/// <summary>
/// Creates an armor item.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="setNumber">The set number.</param>
/// <param name="group">The group.</param>
/// <param name="level">The level.</param>
/// <param name="optionLevel">The option level.</param>
/// <param name="luck">If set to <c>true</c>, the item should have luck.</param>
/// <returns>The created item.</returns>
protected Item CreateArmorItem(byte itemSlot, byte setNumber, byte group, byte level = 0, byte optionLevel = 0, bool luck = false)
{
var item = this.Context.CreateNew<Item>();
item.Definition = this.GameConfiguration.Items.First(def => def.Group == group && def.Number == setNumber);
item.Level = level;
item.Durability = item.Definition.Durability;
item.ItemSlot = itemSlot;
if (optionLevel > 0)
{
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.First(o => o.OptionType == ItemOptionTypes.Option);
optionLink.Level = optionLevel;
item.ItemOptions.Add(optionLink);
}
if (luck)
{
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.First(o => o.OptionType == ItemOptionTypes.Luck);
item.ItemOptions.Add(optionLink);
}
return item;
}
/// <summary>
/// Adds the test jewels and potions.
/// </summary>
/// <param name="inventory">The inventory.</param>
protected void AddTestJewelsAndPotions(ItemStorage inventory)
{
inventory.Items.Add(this.CreateJewelOfBless(12));
inventory.Items.Add(this.CreateJewelOfBless(13));
inventory.Items.Add(this.CreateJewelOfBless(14));
inventory.Items.Add(this.CreateJewelOfBless(15));
inventory.Items.Add(this.CreateJewelOfSoul(16));
inventory.Items.Add(this.CreateJewelOfSoul(17));
inventory.Items.Add(this.CreateJewelOfSoul(18));
inventory.Items.Add(this.CreateJewelOfSoul(19));
inventory.Items.Add(this.CreateHealthPotion(24, 0));
inventory.Items.Add(this.CreateHealthPotion(25, 1));
inventory.Items.Add(this.CreateHealthPotion(26, 2));
inventory.Items.Add(this.CreateHealthPotion(27, 3));
inventory.Items.Add(this.CreateManaPotion(28, 0));
inventory.Items.Add(this.CreateManaPotion(29, 1));
inventory.Items.Add(this.CreateManaPotion(30, 2));
inventory.Items.Add(this.CreateAlcohol(31));
}
/// <summary>
/// Adds scrolls to the inventory.
/// </summary>
/// <param name="inventory">The inventory.</param>
protected void AddScrolls(ItemStorage inventory)
{
inventory.Items.Add(this.CreateScroll(32, 0)); // Scroll of Poison
inventory.Items.Add(this.CreateScroll(33, 4)); // Scroll of Flame
inventory.Items.Add(this.CreateScroll(34, 5)); // Scroll of Teleport
inventory.Items.Add(this.CreateScroll(35, 7)); // Scroll of Twister
inventory.Items.Add(this.CreateScroll(36, 8)); // Scroll of Evil Spirit
inventory.Items.Add(this.CreateScroll(37, 10)); // Scroll of Hellfire
}
/// <summary>
/// Adds the elf items.
/// </summary>
/// <param name="inventory">The inventory.</param>
protected void AddElfItems(ItemStorage inventory)
{
inventory.Items.Add(this.CreateJewelOfBless(12));
inventory.Items.Add(this.CreateJewelOfBless(13));
inventory.Items.Add(this.CreateJewelOfBless(14));
inventory.Items.Add(this.CreateJewelOfBless(15));
inventory.Items.Add(this.CreateJewelOfBless(16));
inventory.Items.Add(this.CreateJewelOfBless(17));
inventory.Items.Add(this.CreateJewelOfBless(18));
inventory.Items.Add(this.CreateJewelOfBless(19));
inventory.Items.Add(this.CreateJewelOfSoul(20));
inventory.Items.Add(this.CreateJewelOfSoul(21));
inventory.Items.Add(this.CreateJewelOfSoul(22));
inventory.Items.Add(this.CreateJewelOfSoul(23));
inventory.Items.Add(this.CreateJewelOfSoul(24));
inventory.Items.Add(this.CreateJewelOfSoul(25));
inventory.Items.Add(this.CreateJewelOfSoul(26));
inventory.Items.Add(this.CreateJewelOfSoul(27));
inventory.Items.Add(this.CreateJewelOfChaos(28));
inventory.Items.Add(this.CreateJewelOfChaos(29));
inventory.Items.Add(this.CreateJewelOfChaos(30));
inventory.Items.Add(this.CreateJewelOfChaos(31));
inventory.Items.Add(this.CreateJewelOfChaos(32));
inventory.Items.Add(this.CreateJewelOfChaos(33));
inventory.Items.Add(this.CreateJewelOfChaos(34));
inventory.Items.Add(this.CreateJewelOfChaos(35));
}
/// <summary>
/// Adds the dark knight items.
/// </summary>
/// <param name="inventory">The inventory.</param>
protected void AddDarkKnightItems(ItemStorage inventory)
{
inventory.Items.Add(this.CreateFullOptionJewellery(53, 8)); // Ring of Ice
inventory.Items.Add(this.CreateFullOptionJewellery(54, 9)); // Ring of Poison
inventory.Items.Add(this.CreateFullOptionJewellery(55, 12)); // Pendant of Lightning
}
/// <summary>
/// Adds the pets.
/// </summary>
/// <param name="inventory">The inventory.</param>
protected void AddPets(ItemStorage inventory)
{
inventory.Items.Add(this.CreatePet(12, 0)); // Guardian Angel
inventory.Items.Add(this.CreatePet(62, 1)); // Imp
inventory.Items.Add(this.CreatePet(70, 2)); // Uniria
}
/// <summary>
/// Creates jewellery with full options.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="number">The number.</param>
/// <returns>The created jewellery.</returns>
protected Item CreateFullOptionJewellery(byte itemSlot, int number)
{
var item = this.Context.CreateNew<Item>();
item.Definition = this.GameConfiguration.Items.First(def => def.Group == 13 && def.Number == number);
item.Durability = item.Definition.Durability;
item.ItemSlot = itemSlot;
foreach (var possibleOption in item.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions))
{
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = possibleOption;
item.ItemOptions.Add(optionLink);
}
return item;
}
/// <summary>
/// Creates the wings with random options.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="number">The number.</param>
/// <param name="level">The level.</param>
/// <param name="group">The group.</param>
/// <returns>The created wings.</returns>
protected Item CreateWings(byte itemSlot, byte number, byte level, byte group = 12)
{
var item = this.Context.CreateNew<Item>();
item.Definition = this.GameConfiguration.Items.First(def => def.Group == group && def.Number == number);
item.Durability = item.Definition.Durability;
item.ItemSlot = itemSlot;
item.Level = level;
var option = item.Definition.PossibleItemOptions.First(o => o.PossibleOptions.Any(p => p.OptionType == ItemOptionTypes.Wing));
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = option.PossibleOptions.SelectRandom();
item.ItemOptions.Add(optionLink);
return item;
}
/// <summary>
/// Creates the weapon.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="group">The group.</param>
/// <param name="number">The number.</param>
/// <param name="level">The level.</param>
/// <param name="optionLevel">The option level.</param>
/// <param name="luck">If set to <c>true</c>, the item should have luck.</param>
/// <param name="skill">If set to <c>true</c>, the item should have skill.</param>
/// <returns>The created weapon.</returns>
protected Item CreateWeapon(byte itemSlot, byte group, byte number, byte level, byte optionLevel, bool luck, bool skill)
{
var weapon = this.Context.CreateNew<Item>();
weapon.Definition = this.GameConfiguration.Items.First(def => def.Group == group && def.Number == number);
weapon.Durability = weapon.Definition.Durability;
weapon.ItemSlot = itemSlot;
weapon.Level = level;
weapon.HasSkill = skill;
if (optionLevel > 0)
{
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = weapon.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.First(o => o.OptionType == ItemOptionTypes.Option);
optionLink.Level = optionLevel;
weapon.ItemOptions.Add(optionLink);
}
if (luck)
{
var optionLink = this.Context.CreateNew<ItemOptionLink>();
optionLink.ItemOption = weapon.Definition.PossibleItemOptions.SelectMany(o => o.PossibleOptions)
.First(o => o.OptionType == ItemOptionTypes.Luck);
weapon.ItemOptions.Add(optionLink);
}
return weapon;
}
/// <summary>
/// Creates the orb.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="itemNumber">The item number.</param>
/// <returns>The created orb.</returns>
protected Item CreateOrb(byte itemSlot, byte itemNumber)
{
var orb = this.Context.CreateNew<Item>();
orb.Definition = this.GameConfiguration.Items.First(def => def.Group == (byte)ItemGroups.Orbs && def.Number == itemNumber);
orb.ItemSlot = itemSlot;
orb.Durability = 1;
return orb;
}
/// <summary>
/// Creates the scroll.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="itemNumber">The item number.</param>
/// <returns>The created scroll.</returns>
protected Item CreateScroll(byte itemSlot, byte itemNumber)
{
var scroll = this.Context.CreateNew<Item>();
scroll.Definition = this.GameConfiguration.Items.First(def => def.Group == (byte)ItemGroups.Scrolls && def.Number == itemNumber);
scroll.ItemSlot = itemSlot;
scroll.Durability = 1;
return scroll;
}
/// <summary>
/// Creates the jewel.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="itemNumber">The item number.</param>
/// <returns>The created jewel.</returns>
protected Item CreateJewel(byte itemSlot, byte itemNumber)
{
var jewel = this.Context.CreateNew<Item>();
jewel.Definition = this.GameConfiguration.Items.First(def => def.Group == 14 && def.Number == itemNumber);
jewel.Durability = 1;
jewel.ItemSlot = itemSlot;
return jewel;
}
/// <summary>
/// Creates the pet.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <param name="itemNumber">The item number.</param>
/// <returns>The created pet.</returns>
protected Item CreatePet(byte itemSlot, byte itemNumber)
{
var pet = this.Context.CreateNew<Item>();
pet.Definition = this.GameConfiguration.Items.First(def => def.Group == 13 && def.Number == itemNumber);
pet.Durability = 255;
pet.ItemSlot = itemSlot;
if (pet.Definition?.Skill != null)
{
pet.HasSkill = true;
}
return pet;
}
/// <summary>
/// Creates the arrows.
/// </summary>
/// <param name="itemSlot">The item slot.</param>
/// <returns>The created arrows.</returns>
protected Item CreateArrows(byte itemSlot)
{
var arrows = this.Context.CreateNew<Item>();
arrows.Definition = this.GameConfiguration.Items.First(def => def.Group == 4 && def.Number == 15);
arrows.Durability = 255;
arrows.ItemSlot = itemSlot;
return arrows;
}
private Item CreateAlcohol(byte itemSlot)
{
var potion = this.Context.CreateNew<Item>();
potion.Definition = this.GameConfiguration.Items.First(def => def.Group == 14 && def.Number == 9);
potion.Durability = 1;
potion.ItemSlot = itemSlot;
return potion;
}
private Item CreateManaPotion(byte itemSlot, byte size)
{
return this.CreatePotion(itemSlot, (byte)(size + 4));
}
private Item CreateHealthPotion(byte itemSlot, byte size)
{
return this.CreatePotion(itemSlot, size);
}
private Item CreatePotion(byte itemSlot, byte itemNumber)
{
var potion = this.Context.CreateNew<Item>();
potion.Definition = this.GameConfiguration.Items.First(def => def.Group == 14 && def.Number == itemNumber);
potion.Durability = 3; // Stack of 3 Potions
potion.ItemSlot = itemSlot;
return potion;
}
private Item CreateJewelOfBless(byte itemSlot)
{
return this.CreateJewel(itemSlot, 13);
}
private Item CreateJewelOfSoul(byte itemSlot)
{
return this.CreateJewel(itemSlot, 14);
}
private Item CreateJewelOfChaos(byte itemSlot)
{
var jewel = this.Context.CreateNew<Item>();
jewel.Definition = this.GameConfiguration.Items.First(def => def.Group == 12 && def.Number == 15);
jewel.Durability = 1;
jewel.ItemSlot = itemSlot;
return jewel;
}
}

View File

@@ -0,0 +1,107 @@
// <copyright file="LowLevel.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.Version075.TestAccounts;
using MUnique.OpenMU.DataModel;
using MUnique.OpenMU.DataModel.Configuration;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic.Attributes;
using MUnique.OpenMU.Persistence.Initialization.CharacterClasses;
/// <summary>
/// Initializer for an account with low level characters.
/// </summary>
internal class LowLevel : AccountInitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="LowLevel"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
/// <param name="accountName">Name of the account.</param>
/// <param name="level">The level.</param>
public LowLevel(IContext context, GameConfiguration gameConfiguration, string accountName, int level)
: base(context, gameConfiguration, accountName, level)
{
}
/// <inheritdoc/>
protected override Character CreateKnight()
{
var character = this.CreateCharacter(this.AccountName + "Dk", CharacterClassNumber.DarkKnight, this.Level, 0);
character.Inventory!.Items.Add(this.CreateSmallAxe(0));
character.Inventory.Items.Add(this.CreateArmorItem(52, 5, 8)); // Leather Armor
character.Inventory.Items.Add(this.CreateArmorItem(47, 5, 7)); // Leather Helm
character.Inventory.Items.Add(this.CreateArmorItem(49, 5, 9)); // Leather Pants
character.Inventory.Items.Add(this.CreateArmorItem(63, 5, 10)); // Leather Gloves
character.Inventory.Items.Add(this.CreateArmorItem(65, 5, 11)); // Leather Boots
this.AddTestJewelsAndPotions(character.Inventory);
return character;
}
/// <inheritdoc/>
protected override Character CreateElf()
{
var character = this.CreateCharacter(this.AccountName + "Elf", CharacterClassNumber.FairyElf, this.Level, 2);
character.Attributes.First(a => a.Definition == Stats.BaseStrength).Value += 20;
character.Attributes.First(a => a.Definition == Stats.BaseAgility).Value += 30;
character.Inventory!.Items.Add(this.CreateShortBow(1));
character.Inventory.Items.Add(this.CreateArrows(0));
character.Inventory.Items.Add(this.CreateArmorItem(InventoryConstants.ArmorSlot, 10, 8)); // Vine Armor
character.Inventory.Items.Add(this.CreateArmorItem(InventoryConstants.HelmSlot, 10, 7)); // Vine Helm
character.Inventory.Items.Add(this.CreateArmorItem(InventoryConstants.PantsSlot, 10, 9)); // Vine Pants
character.Inventory.Items.Add(this.CreateArmorItem(InventoryConstants.GlovesSlot, 10, 10)); // Vine Gloves
character.Inventory.Items.Add(this.CreateArmorItem(InventoryConstants.BootsSlot, 10, 11)); // Vine Boots
character.Inventory.Items.Add(this.CreateOrb(67, 8)); // Healing Orb
character.Inventory.Items.Add(this.CreateOrb(75, 9)); // Defense Orb
character.Inventory.Items.Add(this.CreateOrb(68, 10)); // Damage Orb
this.AddElfItems(character.Inventory);
return character;
}
/// <inheritdoc/>
protected override Character CreateWizard()
{
var character = this.CreateCharacter(this.AccountName + "Dw", CharacterClassNumber.DarkWizard, this.Level, 1);
character.Inventory!.Items.Add(this.CreateSkullStaff(0));
character.Inventory.Items.Add(this.CreateArmorItem(52, 2, 8)); // Pad Armor
character.Inventory.Items.Add(this.CreateArmorItem(47, 2, 7)); // Pad Helm
character.Inventory.Items.Add(this.CreateArmorItem(49, 2, 9)); // Pad Pants
character.Inventory.Items.Add(this.CreateArmorItem(63, 2, 10)); // Pad Gloves
character.Inventory.Items.Add(this.CreateArmorItem(65, 2, 11)); // Pad Boots
this.AddTestJewelsAndPotions(character.Inventory);
this.AddScrolls(character.Inventory);
return character;
}
private Item CreateSkullStaff(byte itemSlot)
{
var skullStaff = this.Context.CreateNew<Item>();
skullStaff.Definition = this.GameConfiguration.Items.First(def => def.Group == 5 && def.Number == 0); // skull staff
skullStaff.Durability = skullStaff.Definition?.Durability ?? 0;
skullStaff.ItemSlot = itemSlot;
return skullStaff;
}
private Item CreateSmallAxe(byte itemSlot)
{
var smallAxe = this.Context.CreateNew<Item>();
smallAxe.Definition = this.GameConfiguration.Items.First(def => def.Group == 1 && def.Number == 0); // small axe
smallAxe.Durability = smallAxe.Definition?.Durability ?? 0;
smallAxe.ItemSlot = itemSlot;
return smallAxe;
}
private Item CreateShortBow(byte itemSlot)
{
var shortBow = this.Context.CreateNew<Item>();
shortBow.Definition = this.GameConfiguration.Items.First(def => def.Group == 4 && def.Number == 0); // short bow
shortBow.Durability = shortBow.Definition?.Durability ?? 0;
shortBow.ItemSlot = itemSlot;
return shortBow;
}
}

View File

@@ -0,0 +1,33 @@
// <copyright file="TestAccountsInitialization.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.Version075.TestAccounts;
using MUnique.OpenMU.DataModel.Configuration;
/// <summary>
/// Initializes the test accounts.
/// </summary>
public class TestAccountsInitialization : InitializerBase
{
/// <summary>
/// Initializes a new instance of the <see cref="TestAccountsInitialization"/> class.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="gameConfiguration">The game configuration.</param>
public TestAccountsInitialization(IContext context, GameConfiguration gameConfiguration)
: base(context, gameConfiguration)
{
}
/// <inheritdoc />
public override void Initialize()
{
for (int i = 0; i < 10; i++)
{
var level = (i * 20) + 1;
new LowLevel(this.Context, this.GameConfiguration, "test" + i, level).Initialize();
}
}
}