Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions Maple2.Database/Storage/Metadata/MapEntityStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public class MapEntityStorage(MetadataContext context) : MetadataStorage<string,
var playerSpawns = new Dictionary<int, SpawnPointPC>();
var npcSpawns = new List<SpawnPointNPC>();
var regionSpawns = new Dictionary<int, Ms2RegionSpawn>();
var boxRegionSpawns = new Dictionary<int, Ms2RegionBoxSpawn>();
var regionSkills = new List<Ms2RegionSkill>();
var eventNpcSpawns = new Dictionary<int, EventSpawnPointNPC>();
var eventItemSpawns = new Dictionary<int, EventSpawnPointItem>();
Expand Down Expand Up @@ -69,9 +68,6 @@ public class MapEntityStorage(MetadataContext context) : MetadataStorage<string,
case Portal portal:
portals[portal.Id] = portal;
break;
case Ms2RegionBoxSpawn boxRegionSpawn:
boxRegionSpawns[boxRegionSpawn.Id] = boxRegionSpawn;
break;
case Ms2RegionSpawn regionSpawn:
regionSpawns[regionSpawn.Id] = regionSpawn;
break;
Expand Down Expand Up @@ -131,7 +127,6 @@ public class MapEntityStorage(MetadataContext context) : MetadataStorage<string,
EventNpcSpawns = eventNpcSpawns,
EventItemSpawns = eventItemSpawns,
RegionSpawns = regionSpawns,
BoxRegionSpawns = boxRegionSpawns,
RegionSkills = regionSkills,
Taxi = taxi,
BoundingBox = bounding ?? LargeBoundingBox,
Expand Down
5 changes: 0 additions & 5 deletions Maple2.File.Ingest/Mapper/MapEntityMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,6 @@ private IEnumerable<MapEntity> ParseMap(string xblock, IEnumerable<IMapEntity> e
continue;
}
continue;
case IMS2RegionBoxSpawn boxSpawn:
yield return new MapEntity(xblock, new Guid(entity.EntityId), entity.EntityName) {
Block = new Ms2RegionBoxSpawn(boxSpawn.SpawnPointID, (int) boxSpawn.SpawnTypeID, boxSpawn.Scale, boxSpawn.Position, boxSpawn.Rotation)
};
continue;
case IMS2RegionSpawnBase spawn:
yield return new MapEntity(xblock, new Guid(entity.EntityId), entity.EntityName) {
Block = new Ms2RegionSpawn(spawn.SpawnPointID, spawn.UseRotAsSpawnDir, spawn.Position, spawn.Rotation)
Expand Down
1 change: 0 additions & 1 deletion Maple2.Model/Metadata/MapEntity/MapEntity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,4 @@ public MapEntity(string xBlock, Guid guid, string name) {
[JsonDerivedType(typeof(TriggerModel), 1436346081)]
[JsonDerivedType(typeof(Ms2Bounding), 1539875768)]
[JsonDerivedType(typeof(MS2PatrolData), 250722994)]
[JsonDerivedType(typeof(Ms2RegionBoxSpawn), 465193598)]
public abstract record MapBlock;
11 changes: 0 additions & 11 deletions Maple2.Model/Metadata/MapEntity/Ms2RegionBoxSpawn.cs

This file was deleted.

1 change: 0 additions & 1 deletion Maple2.Model/Metadata/MapEntityMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public class MapEntityMetadata {
public required IReadOnlyDictionary<int, SpawnPointPC> PlayerSpawns { get; init; }
public required IReadOnlyList<SpawnPointNPC> NpcSpawns { get; init; }
public required IReadOnlyDictionary<int, Ms2RegionSpawn> RegionSpawns { get; init; }
public required IReadOnlyDictionary<int, Ms2RegionBoxSpawn> BoxRegionSpawns { get; init; }
public required IReadOnlyList<Ms2RegionSkill> RegionSkills { get; init; }
public required IReadOnlyDictionary<int, EventSpawnPointNPC> EventNpcSpawns { get; init; }
public required IReadOnlyDictionary<int, EventSpawnPointItem> EventItemSpawns { get; init; }
Expand Down
46 changes: 45 additions & 1 deletion Maple2.Server.Game/Commands/FieldCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.CommandLine.Invocation;
using System.CommandLine.IO;
using Maple2.Database.Storage;
using Maple2.Model.Metadata;
using Maple2.Server.Game.Model;
using Maple2.Server.Game.Session;

Expand All @@ -13,12 +14,16 @@ public class FieldCommand : Command {

private readonly GameSession session;
private readonly MapMetadataStorage mapStorage;
private readonly MapEntityStorage mapEntities;

public FieldCommand(GameSession session, MapMetadataStorage mapStorage) : base(NAME, DESCRIPTION) {
public FieldCommand(GameSession session, MapMetadataStorage mapStorage, MapEntityStorage mapEntities) : base(NAME, DESCRIPTION) {
this.session = session;
this.mapStorage = mapStorage;
this.mapEntities = mapEntities;

AddCommand(new EntityInfoCommand(session));
AddCommand(new SpawnPointsCommand(session, mapStorage, mapEntities));

this.SetHandler<InvocationContext>(Handle);
}

Expand Down Expand Up @@ -64,4 +69,43 @@ private void Handle(InvocationContext ctx, int objectId) {
}
}
}

private class SpawnPointsCommand : Command {
private readonly GameSession session;
private readonly MapMetadataStorage mapStorage;
private readonly MapEntityStorage mapEntities;

public SpawnPointsCommand(GameSession session, MapMetadataStorage mapStorage, MapEntityStorage mapEntities) : base("spawnpoints", "Prints all spawn points in the map.") {
this.session = session;
this.mapStorage = mapStorage;
this.mapEntities = mapEntities;

this.SetHandler<InvocationContext>(Handle);
}

private void Handle(InvocationContext ctx) {
if (session.Field == null) {
ctx.Console.Error.WriteLine("No active field");
ctx.ExitCode = 1;
return;
}

if (!mapStorage.TryGet(session.Field.MapId, out MapMetadata? map)) {
ctx.Console.Out.WriteLine($"Unknown map: {session.Field.MapId}");
return;
}

MapEntityMetadata? mapEntityMetadata = mapEntities.Get(map.XBlock);
if (mapEntityMetadata == null) {
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}");
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public partial class FieldManager {
private readonly ConcurrentDictionary<int, FieldItem> fieldItems = new();
private readonly ConcurrentDictionary<int, FieldMobSpawn> fieldMobSpawns = new();
private readonly ConcurrentDictionary<int, FieldSpawnPointNpc> fieldSpawnPointNpcs = new();
private readonly ConcurrentDictionary<int, FieldPlayerSpawnPoint> fieldPlayerSpawnPoints = new();
private readonly ConcurrentDictionary<int, FieldSpawnGroup> fieldSpawnGroups = new();
private readonly ConcurrentDictionary<int, FieldSkill> fieldSkills = new();
private readonly ConcurrentDictionary<int, FieldPortal> fieldPortals = new();
Expand Down Expand Up @@ -81,7 +82,7 @@ public FieldPlayer SpawnPlayer(GameSession session, Player player, int portalId

// Use SpawnPoint if needed.
if (fieldPlayer.Position == default) {
SpawnPointPC? spawn = Entities.PlayerSpawns.Values.FirstOrDefault(spawn => spawn.Enable);
FieldPlayerSpawnPoint? spawn = fieldPlayerSpawnPoints.Values.FirstOrDefault(spawn => spawn.Enable);
if (spawn != null) {
fieldPlayer.Position = spawn.Position + new Vector3(0, 0, 25);
fieldPlayer.Rotation = spawn.Rotation;
Expand Down Expand Up @@ -380,7 +381,7 @@ public void ToggleNpcSpawnPoint(int spawnId) {
}

public void SpawnInteractObject(SpawnInteractObjectMetadata metadata) {
if (!Entities.BoxRegionSpawns.TryGetValue(metadata.RegionSpawnId, out Ms2RegionBoxSpawn? boxSpawn) ||
if (!Entities.RegionSpawns.TryGetValue(metadata.RegionSpawnId, out Ms2RegionSpawn? boxSpawn) ||
!TableMetadata.InteractObjectTable.Entries.TryGetValue(metadata.InteractId, out InteractObjectMetadata? interactObjectMetadata)) {
return;
}
Expand Down Expand Up @@ -743,7 +744,7 @@ public void OnAddPlayer(FieldPlayer added) {
}
}

added.Session.Send(FunctionCubePacket.SendCubes(fieldFunctionInteracts.Values.ToList()));
added.Session.Send(FunctionCubePacket.SendCubes(fieldFunctionInteracts.Values));

foreach (Plot plot in Plots.Values) {
foreach (PlotCube plotCube in plot.Cubes.Values) {
Expand Down
8 changes: 8 additions & 0 deletions Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,10 @@ public virtual void Init() {
AddSpawnPointNpc(spawnPointNpc);
}

foreach ((int id, SpawnPointPC spawnPoint) in Entities.PlayerSpawns) {
fieldPlayerSpawnPoints[id] = new FieldPlayerSpawnPoint(this, NextLocalId(), spawnPoint);
}

IList<MapMetadata> bonusMaps = MapMetadata.GetMapsByType(Metadata.Property.Continent, MapType.PocketRealm);
foreach (MapMetadataSpawn spawn in Metadata.Spawns) {
if (!Entities.RegionSpawns.TryGetValue(spawn.Id, out Ms2RegionSpawn? regionSpawn)) {
Expand Down Expand Up @@ -347,6 +351,10 @@ public bool TryGetPortal(int portalId, [NotNullWhen(true)] out FieldPortal? port
return portal != null;
}

public bool TryGetPlayerSpawn(int id, [NotNullWhen(true)] out FieldPlayerSpawnPoint? playerSpawnPoint) {
return fieldPlayerSpawnPoints.TryGetValue(id, out playerSpawnPoint);
}

public bool TryGetItem(int objectId, [NotNullWhen(true)] out FieldItem? fieldItem) {
return fieldItems.TryGetValue(objectId, out fieldItem);
}
Expand Down
14 changes: 14 additions & 0 deletions Maple2.Server.Game/Model/Field/Entity/FieldPlayerSpawnPoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Maple2.Model.Metadata;
using Maple2.Server.Game.Manager.Field;

namespace Maple2.Server.Game.Model;

public class FieldPlayerSpawnPoint : FieldEntity<SpawnPointPC> {
public bool Enable;

public FieldPlayerSpawnPoint(FieldManager field, int objectId, SpawnPointPC metadata) : base(field, objectId, metadata) {
Enable = metadata.Enable;
Position = metadata.Position;
Rotation = metadata.Rotation;
}
}
9 changes: 5 additions & 4 deletions Maple2.Server.Game/Trigger/TriggerContext.Field.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ public void SightRange(bool enabled, int range, int rangeZ, int border) {
for (int i = 0; i < range; i++) {
sightRange.Fades[i] = rangeZ;
}
sightRange.Opacity = (byte) (100 - border);

sightRange.Opacity = (byte) border;
sightRange.Opaque = false;
sightRange.Unknown = enabled;
Broadcast(FieldPropertyPacket.Add(sightRange));
Expand Down Expand Up @@ -456,10 +457,10 @@ public void StartCombineSpawn(int[] groupIds, bool isStart) {
}
}

public void SetTimer(string timerId, int seconds, bool disableUi, bool autoRemove, int vOffset, string type, string desc) {
public void SetTimer(string timerId, int seconds, bool autoRemove, bool display, int vOffset, string type, string desc) {
DebugLog("[SetTimer] timerId:{Id}, seconds:{Seconds}", timerId, seconds);
Field.Timers[timerId] = new TickTimer(seconds * 1000, autoRemove, vOffset, !disableUi, type);
if (!disableUi) {
Field.Timers[timerId] = new TickTimer(seconds * 1000, autoRemove, vOffset, display, type);
if (display) {
Broadcast(TriggerPacket.TimerDialog(Field.Timers[timerId]));
}
}
Expand Down
8 changes: 7 additions & 1 deletion Maple2.Server.Game/Trigger/TriggerContext.Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@ namespace Maple2.Server.Game.Trigger;

public partial class TriggerContext {
public void EnableSpawnPointPc(int spawnPointId, bool enabled) {
ErrorLog("[EnableSpawnPointPc] spawnPointId:{Type}, enabled:{Enabled}", spawnPointId, enabled);
DebugLog("[EnableSpawnPointPc] spawnPointId:{Type}, enabled:{Enabled}", spawnPointId, enabled);
if (!Field.TryGetPlayerSpawn(spawnPointId, out FieldPlayerSpawnPoint? fieldPlayerSpawn)) {
logger.Error("[EnableSpawnPointPc] Invalid Player Spawn Point ID: {spawnPointId} in Map ID: {mapId}", spawnPointId, Field.MapId);
return;
}

fieldPlayerSpawn.Enable = enabled;
}

public void GiveExp(int boxId, float expRate, bool arg3) {
Expand Down