diff --git a/Maple2.Database/Storage/Metadata/MapEntityStorage.cs b/Maple2.Database/Storage/Metadata/MapEntityStorage.cs index 19ff31cc9..c161ff380 100644 --- a/Maple2.Database/Storage/Metadata/MapEntityStorage.cs +++ b/Maple2.Database/Storage/Metadata/MapEntityStorage.cs @@ -32,7 +32,7 @@ public class MapEntityStorage(MetadataContext context) : MetadataStorage(); var objectWeapons = new Dictionary(); var portals = new Dictionary(); - var playerSpawns = new Dictionary(); + var playerSpawns = new List(); var npcSpawns = new List(); var regionSpawns = new Dictionary(); var regionSkills = new List(); @@ -72,7 +72,7 @@ public class MapEntityStorage(MetadataContext context) : MetadataStorage LiftableTargetBoxes { get; init; } public required IReadOnlyDictionary ObjectWeapons { get; init; } public required IReadOnlyDictionary Portals { get; init; } - public required IReadOnlyDictionary PlayerSpawns { get; init; } + public required IReadOnlyList PlayerSpawns { get; init; } public required IReadOnlyList NpcSpawns { get; init; } public required IReadOnlyDictionary RegionSpawns { get; init; } public required IReadOnlyList RegionSkills { get; init; } diff --git a/Maple2.Server.Game/Commands/FieldCommand.cs b/Maple2.Server.Game/Commands/FieldCommand.cs index cab37a712..6243be1cc 100644 --- a/Maple2.Server.Game/Commands/FieldCommand.cs +++ b/Maple2.Server.Game/Commands/FieldCommand.cs @@ -98,11 +98,9 @@ private void Handle(InvocationContext ctx) { ctx.Console.Out.WriteLine($"No xblock data found for map: {session.Field.MapId}"); return; } - - foreach ((int id, SpawnPointPC spawnPoint) in mapEntityMetadata.PlayerSpawns) { - if (session.Field.TryGetPlayerSpawn(id, out FieldPlayerSpawnPoint? fieldPlayerSpawnPoint)) { - ctx.Console.Out.WriteLine($"Id: {id}, Position: {spawnPoint.Position}. Enabled: {fieldPlayerSpawnPoint.Enable}"); - } + List playerSpawns = session.Field.GetPlayerSpawns(); + foreach (FieldPlayerSpawnPoint playerSpawn in playerSpawns) { + ctx.Console.Out.WriteLine($"Id: {playerSpawn.Id}, Position: {playerSpawn.Position}. Enabled: {playerSpawn.Enable}"); } } } diff --git a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs index d6e8f1028..1a73c30e6 100644 --- a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs +++ b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs @@ -174,8 +174,13 @@ public virtual void Init() { AddSpawnPointNpc(spawnPointNpc); } - foreach ((int id, SpawnPointPC spawnPoint) in Entities.PlayerSpawns) { - fieldPlayerSpawnPoints[id] = new FieldPlayerSpawnPoint(this, NextLocalId(), spawnPoint); + foreach (SpawnPointPC spawnPoint in Entities.PlayerSpawns) { + int fieldId = spawnPoint.SpawnPointId; + if (fieldPlayerSpawnPoints.ContainsKey(fieldId)) { + // Duplicate spawn point id (ex. unassigned ID), use next local id + fieldId = NextLocalId(); + } + fieldPlayerSpawnPoints[fieldId] = new FieldPlayerSpawnPoint(this, NextLocalId(), spawnPoint, fieldId); } foreach (TriggerModel trigger in Entities.TriggerModels.Values) { @@ -468,6 +473,10 @@ public bool TryGetPlayerSpawn(int id, [NotNullWhen(true)] out FieldPlayerSpawnPo return fieldPlayerSpawnPoints.TryGetValue(id, out playerSpawnPoint); } + public List GetPlayerSpawns() { + return fieldPlayerSpawnPoints.Values.ToList(); + } + public bool TryGetItem(int objectId, [NotNullWhen(true)] out FieldItem? fieldItem) { return fieldItems.TryGetValue(objectId, out fieldItem); } diff --git a/Maple2.Server.Game/Model/Field/Entity/FieldPlayerSpawnPoint.cs b/Maple2.Server.Game/Model/Field/Entity/FieldPlayerSpawnPoint.cs index a465799c7..29fa8778b 100644 --- a/Maple2.Server.Game/Model/Field/Entity/FieldPlayerSpawnPoint.cs +++ b/Maple2.Server.Game/Model/Field/Entity/FieldPlayerSpawnPoint.cs @@ -5,10 +5,12 @@ namespace Maple2.Server.Game.Model; public class FieldPlayerSpawnPoint : FieldEntity { public bool Enable; + public int Id { get; init; } - public FieldPlayerSpawnPoint(FieldManager field, int objectId, SpawnPointPC metadata) : base(field, objectId, metadata) { + public FieldPlayerSpawnPoint(FieldManager field, int objectId, SpawnPointPC metadata, int id) : base(field, objectId, metadata) { Enable = metadata.Enable; Position = metadata.Position; Rotation = metadata.Rotation; + Id = id; } }