diff --git a/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs b/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs index e74b7925..11fd6ae2 100644 --- a/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs +++ b/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs @@ -8,6 +8,7 @@ using Refresh.GameServer.Endpoints.Game.Levels.FilterSettings; using Refresh.GameServer.Extensions; using Refresh.GameServer.Services; +using Refresh.GameServer.Types; using Refresh.GameServer.Types.Activity; using Refresh.GameServer.Types.Assets; using Refresh.GameServer.Types.Levels; @@ -143,6 +144,17 @@ public GameLevel GetStoryLevelById(int id) return level; } + public GameLevel? UpdateLevelLocation(GameLevel level, GameLocation location) + { + this.Write(() => + { + level.LocationX = location.X; + level.LocationY = location.Y; + }); + + return level; + } + public void DeleteLevel(GameLevel level) { this.Write(() => diff --git a/Refresh.GameServer/Endpoints/Game/UserEndpoints.cs b/Refresh.GameServer/Endpoints/Game/UserEndpoints.cs index a24544b9..9581d5ca 100644 --- a/Refresh.GameServer/Endpoints/Game/UserEndpoints.cs +++ b/Refresh.GameServer/Endpoints/Game/UserEndpoints.cs @@ -7,9 +7,11 @@ using Refresh.Common.Constants; using Refresh.GameServer.Authentication; using Refresh.GameServer.Database; +using Refresh.GameServer.Endpoints.Game.DataTypes.Request; using Refresh.GameServer.Endpoints.Game.DataTypes.Response; using Refresh.GameServer.Services; using Refresh.GameServer.Types.Data; +using Refresh.GameServer.Types.Levels; using Refresh.GameServer.Types.Lists; using Refresh.GameServer.Types.Roles; using Refresh.GameServer.Types.UserData; @@ -123,6 +125,40 @@ public SerializedFriendsList GetFriends(RequestContext context, GameDatabaseCont } } } + + if (data.Levels != null) + { + int failedLevelUpdates = 0; + + // Since you can only update level's locations through this endpoint, update their locations + foreach (GameLevelRequest LevelRequest in data.Levels) + { + // Incase there is no location data provided for this level for some reason + if (LevelRequest.Location == null) + { + failedLevelUpdates++; + continue; + } + + // Verify if this level can be updated + GameLevel? Level = database.GetLevelById(LevelRequest.LevelId); + if (Level == null) + { + failedLevelUpdates++; + continue; + } + + if (Level.Publisher == null || Level.Publisher.UserId != user.UserId) + { + failedLevelUpdates++; + continue; + } + + database.UpdateLevelLocation(Level, LevelRequest.Location); + } + + if (failedLevelUpdates > 0) database.AddErrorNotification("Level update failed", $"Failed to update {failedLevelUpdates} out of {data.Levels.Count} level locations.", user); + } if (data.PlanetsHash != null && !dataStore.ExistsInStore(data.PlanetsHash)) { diff --git a/Refresh.GameServer/Types/UserData/SerializedUpdateData.cs b/Refresh.GameServer/Types/UserData/SerializedUpdateData.cs index 386d997f..74ab3f93 100644 --- a/Refresh.GameServer/Types/UserData/SerializedUpdateData.cs +++ b/Refresh.GameServer/Types/UserData/SerializedUpdateData.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using Realms; +using Refresh.GameServer.Endpoints.Game.DataTypes.Request; namespace Refresh.GameServer.Types.UserData; @@ -32,4 +33,7 @@ public class SerializedUpdateData [XmlElement("meh2")] public string? MehFaceHash { get; set; } + + [XmlArray("slots")] + public List? Levels { get; set; } } \ No newline at end of file