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
2 changes: 2 additions & 0 deletions Maple2.Database/Context/Ms2Context.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public sealed class Ms2Context(DbContextOptions options) : DbContext(options) {
internal DbSet<HomeLayout> HomeLayout { get; set; } = null!;
internal DbSet<HomeLayoutCube> UgcCubeLayout { get; set; } = null!;
internal DbSet<Marriage> Marriage { get; set; } = null!;
internal DbSet<WeddingHall> WeddingHall { get; set; } = null!;
internal DbSet<Nurturing> Nurturing { get; set; } = null!;

protected override void OnModelCreating(ModelBuilder modelBuilder) {
Expand Down Expand Up @@ -75,6 +76,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<HomeLayout>(Maple2.Database.Model.HomeLayout.Configure);
modelBuilder.Entity<HomeLayoutCube>(Maple2.Database.Model.HomeLayoutCube.Configure);
modelBuilder.Entity<Marriage>(Maple2.Database.Model.Marriage.Configure);
modelBuilder.Entity<WeddingHall>(Maple2.Database.Model.WeddingHall.Configure);
modelBuilder.Entity<Nurturing>(Maple2.Database.Model.Nurturing.Configure);

modelBuilder.Entity<MesoListing>(MesoListing.Configure);
Expand Down
3 changes: 3 additions & 0 deletions Maple2.Database/Model/Mail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ internal class Mail {
public string SenderName { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
public string WeddingInvite { get; set; } = string.Empty;

// List is used here to preserve order
public IList<string> TitleArgs { get; set; } = Array.Empty<string>();
Expand All @@ -41,6 +42,7 @@ internal class Mail {
Content = other.Content,
TitleArgs = other.TitleArgs.Select(entry => $"{entry.Key}={entry.Value}").ToArray(),
ContentArgs = other.ContentArgs.Select(entry => $"{entry.Key}={entry.Value}").ToArray(),
WeddingInvite = other.WeddingInvite,
Currency = new MailCurrency {
Meso = other.Meso,
MesoCollectTime = other.MesoCollectTime,
Expand Down Expand Up @@ -72,6 +74,7 @@ internal class Mail {
string[] split = arg.Split("=", 2);
return split.Length > 1 ? (split[0], split[1]) : ("key", split[0]);
}).ToArray(),
WeddingInvite = other.WeddingInvite,
Meso = other.Currency.Meso,
MesoCollectTime = other.Currency.MesoCollectTime,
Meret = other.Currency.Meret,
Expand Down
67 changes: 67 additions & 0 deletions Maple2.Database/Model/WeddingHall.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.Diagnostics.CodeAnalysis;
using Maple2.Database.Extensions;
using Maple2.Model.Enum;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Maple2.Database.Model;

internal class WeddingHall {
public long Id { get; set; }
public long MarriageId { get; set; }
Comment thread
AngeloTadeucci marked this conversation as resolved.
public DateTime CeremonyTime { get; set; }
public int PackageId { get; set; }
public int PackageHallId { get; set; }
public long OwnerId { get; set; }
public bool Public { get; set; }
public Dictionary<long, long> GuestList { get; set; } = new(); // CharacterId, AccountId
public DateTime CreationTime { get; set; }

[return: NotNullIfNotNull(nameof(other))]
public static implicit operator WeddingHall?(Maple2.Model.Game.WeddingHall? other) {
return other == null ? null : new WeddingHall {
Id = other.Id,
MarriageId = other.MarriageId,
CeremonyTime = other.CeremonyTime.FromEpochSeconds(),
PackageId = other.PackageId,
PackageHallId = other.PackageHallId,
Public = other.Public,
CreationTime = other.CreationTime.FromEpochSeconds(),
GuestList = other.GuestList,
OwnerId = other.ReserverCharacterId,
};
}
Comment thread
Zintixx marked this conversation as resolved.

// Use explicit Convert() here because we need marriage data to construct Wedding Hall.
public Maple2.Model.Game.WeddingHall Convert(Maple2.Model.Game.Marriage marriage) {
Maple2.Model.Game.MarriagePartner reserver = marriage.Partner1.Info!.CharacterId == OwnerId ? marriage.Partner1 : marriage.Partner2;
Maple2.Model.Game.MarriagePartner partner = marriage.Partner1.Info!.CharacterId == OwnerId ? marriage.Partner2 : marriage.Partner1;
Comment thread
Zintixx marked this conversation as resolved.
var hall = new Maple2.Model.Game.WeddingHall {
Id = Id,
MarriageId = MarriageId,
CeremonyTime = CeremonyTime.ToEpochSeconds(),
PackageId = PackageId,
PackageHallId = PackageHallId,
Public = Public,
ReserverCharacterId = reserver.CharacterId,
ReserverAccountId = reserver.AccountId,
ReserverName = reserver.Info!.Name,
PartnerName = partner.Info!.Name,
CreationTime = CreationTime.ToEpochSeconds(),
GuestList = GuestList,
};

return hall;
}

public static void Configure(EntityTypeBuilder<WeddingHall> builder) {
builder.ToTable("wedding-hall");
builder.HasKey(hall => hall.Id);
builder.Property(hall => hall.GuestList).HasJsonConversion().IsRequired();

builder.OneToOne<WeddingHall, Marriage>()
.HasForeignKey<WeddingHall>(hall => hall.MarriageId);
builder.Property(hall => hall.CreationTime)
.ValueGeneratedOnAdd();
}
}
100 changes: 92 additions & 8 deletions Maple2.Database/Storage/Game/GameStorage.Wedding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Maple2.Model.Game;
using Marriage = Maple2.Model.Game.Marriage;
using MarriageExp = Maple2.Model.Game.MarriageExp;
using WeddingHall = Maple2.Model.Game.WeddingHall;

namespace Maple2.Database.Storage;

Expand All @@ -25,11 +26,32 @@ public partial class Request {
return null;
}

return Commit() ? GetMarriage(marriageId: marriage.Id) : null;
return Commit() ? GetMarriage(partner1Id) : null;
}

public Marriage? GetMarriage(long marriageId = 0, long characterId = 0) {
Model.Marriage? marriage = marriageId > 0 ? Context.Marriage.Find(marriageId) :
public bool SaveMarriage(Marriage marriage) {
// Don't save marriage if it was disbanded.
if (!Context.Marriage.Any(model => model.Id == marriage.Id)) {
return false;
}

Context.Marriage.Update(marriage);

return Context.TrySaveChanges();
}

public bool DeleteMarriage(long marriageId) {
Model.Marriage? marriage = Context.Marriage.Find(marriageId);
if (marriage == null) {
return false;
}

Context.Marriage.Remove(marriage);
return Context.TrySaveChanges();
}

public Marriage? GetMarriage(long characterId = 0, long weddingId = 0) {
Model.Marriage? marriage = weddingId > 0 ? Context.Marriage.Find(weddingId) :
Context.Marriage.FirstOrDefault(marriage => marriage.Partner1Id == characterId || marriage.Partner2Id == characterId);
if (marriage == null) {
return null;
Expand All @@ -40,23 +62,23 @@ public partial class Request {
if (partner1 == null || partner2 == null) {
return null;
}

return new Marriage {
Id = marriage.Id,
CreationTime = marriage.CreationTime.ToEpochSeconds(),
ExpHistory = marriage.ExpHistory.Select<Model.MarriageExp, MarriageExp>(exp => exp).ToList(),
Partner1 = new MarriagePartner {
Info = partner1,
Message = marriage.Partner1Message,
Info = partner1.CharacterId == characterId ? partner2 : partner1,
Message = partner1.CharacterId == characterId ? marriage.Partner2Message : marriage.Partner1Message,
},
Partner2 = new MarriagePartner {
Info = partner2,
Message = marriage.Partner2Message,
Info = partner1.CharacterId == characterId ? partner1 : partner2,
Message = partner1.CharacterId == characterId ? marriage.Partner1Message : marriage.Partner2Message,
},
Status = marriage.Status,
};
}


public MarriageInfo GetMarriageInfo(long characterId) {
Model.Marriage? model = Context.Marriage.FirstOrDefault(member => member.Partner1Id == characterId || member.Partner2Id == characterId);
if (model == null) {
Expand All @@ -73,5 +95,67 @@ public MarriageInfo GetMarriageInfo(long characterId) {
Partner2Name = partner.Name,
};
}

public WeddingHall? CreateWeddingHall(WeddingHall hall, Marriage marriage) {
BeginTransaction();

Model.WeddingHall model = hall;
model.MarriageId = marriage.Id;
model.OwnerId = marriage.Partner1.CharacterId;
model.CreationTime = DateTime.Now;
Context.WeddingHall.Add(model);
if (!SaveChanges()) {
return null;
}

return Commit() ? GetWeddingHall(marriage) : null;
}

public WeddingHall? GetWeddingHall(Marriage marriage) {
Model.WeddingHall? model = Context.WeddingHall.FirstOrDefault(hall => hall.MarriageId == marriage.Id);
return model?.Convert(marriage);
}

public WeddingHall? GetWeddingHall(long hallId = 0, long marriageId = 0) {
Model.WeddingHall? model = hallId > 0 ? Context.WeddingHall.Find(hallId) :
Context.WeddingHall.FirstOrDefault(hall => hall.MarriageId == marriageId);

if (model == null) {
return null;
}

Marriage? marriage = GetMarriage(weddingId: marriageId);
return marriage == null ? null : model.Convert(marriage);
}
Comment thread
Zintixx marked this conversation as resolved.

public bool DeleteWeddingHall(long hallId) {
Model.WeddingHall? hall = Context.WeddingHall.Find(hallId);
if (hall == null) {
return false;
}

Context.WeddingHall.Remove(hall);
return Context.TrySaveChanges();
}

public bool WeddingHallTimeIsAvailable(long ceremonyTime) {
DateTime ceremonyDateTime = ceremonyTime.FromEpochSeconds();
return Context.WeddingHall.FirstOrDefault(hall => hall.CeremonyTime == ceremonyDateTime) == null;
}

public IEnumerable<WeddingHall> GetWeddingHalls() {
List<Model.WeddingHall> entries = Context.WeddingHall
.Where(hall => hall.CeremonyTime > DateTime.Now)
.AsEnumerable()
.ToList();

foreach (Model.WeddingHall entry in entries) {
Marriage? marriage = GetMarriage(weddingId: entry.MarriageId);
if (marriage == null) {
continue;
}
yield return entry.Convert(marriage);
}
}
}
}
3 changes: 3 additions & 0 deletions Maple2.Database/Storage/Metadata/TableMetadataStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public class TableMetadataStorage {
private readonly Lazy<WorldMapTable> worldMapTable;
private readonly Lazy<SurvivalSkinInfoTable> survivalSkinInfoTable;
private readonly Lazy<BannerTable> bannerTable;
private readonly Lazy<WeddingTable> weddingTable;
Comment thread
Zintixx marked this conversation as resolved.

private readonly Lazy<EnchantScrollTable> enchantScrollTable;
private readonly Lazy<ItemRemakeScrollTable> itemRemakeScrollTable;
Expand Down Expand Up @@ -102,6 +103,7 @@ public class TableMetadataStorage {
public WorldMapTable WorldMapTable => worldMapTable.Value;
public SurvivalSkinInfoTable SurvivalSkinInfoTable => survivalSkinInfoTable.Value;
public BannerTable BannerTable => bannerTable.Value;
public WeddingTable WeddingTable => weddingTable.Value;

public EnchantScrollTable EnchantScrollTable => enchantScrollTable.Value;
public ItemRemakeScrollTable ItemRemakeScrollTable => itemRemakeScrollTable.Value;
Expand Down Expand Up @@ -160,6 +162,7 @@ public TableMetadataStorage(MetadataContext context) {
worldMapTable = Retrieve<WorldMapTable>(context, "newworldmap.xml");
survivalSkinInfoTable = Retrieve<SurvivalSkinInfoTable>(context, "maplesurvivalskininfo.xml");
bannerTable = Retrieve<BannerTable>(context, "banner.xml");
weddingTable = Retrieve<WeddingTable>(context, "wedding*.xml");
enchantScrollTable = Retrieve<EnchantScrollTable>(context, "enchantscroll.xml");
itemRemakeScrollTable = Retrieve<ItemRemakeScrollTable>(context, "itemremakescroll.xml");
itemRepackingScrollTable = Retrieve<ItemRepackingScrollTable>(context, "itemrepackingscroll.xml");
Expand Down
2 changes: 1 addition & 1 deletion Maple2.File.Ingest/Maple2.File.Ingest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<PackageReference Include="Crc32.NET" Version="1.2.0" />
<PackageReference Include="CsvHelper" Version="32.0.2" />
<PackageReference Include="DotNetZip" Version="1.16.0" />
<PackageReference Include="Maple2.File.Parser.Tadeucci" Version="2.1.30" />
<PackageReference Include="Maple2.File.Parser.Tadeucci" Version="2.1.32" />
<PackageReference Include="DotRecast.Core" Version="2024.2.3" />
<PackageReference Include="DotRecast.Detour" Version="2024.2.3" />
<PackageReference Include="DotRecast.Recast" Version="2024.2.3" />
Expand Down
Loading