Implement Basic Cafe, Furniture & Cafe Command

This commit is contained in:
raphaeIl 2024-11-09 04:11:59 -05:00
parent 5397797315
commit e69b192c2c
9 changed files with 1285 additions and 169 deletions

View File

@ -108,5 +108,29 @@
return [.. scenarios]; return [.. scenarios];
} }
public static List<CafeDB> AddCafes(this AccountDB account, SCHALEContext context, params CafeDB[] cafes)
{
foreach (var cafe in cafes)
{
cafe.AccountServerId = account.ServerId;
context.Cafes.Add(cafe);
}
return [.. cafes];
}
public static List<FurnitureDB> AddFurnitures(this AccountDB account, SCHALEContext context, params FurnitureDB[] furnitures)
{
foreach (var furniture in furnitures)
{
furniture.AccountServerId = account.ServerId;
context.Furnitures.Add(furniture);
}
return [.. furnitures];
}
} }
} }

View File

@ -24,6 +24,9 @@ namespace SCHALE.Common.Database
public DbSet<EchelonDB> Echelons { get; set; } public DbSet<EchelonDB> Echelons { get; set; }
public DbSet<AccountTutorial> AccountTutorials { get; set; } public DbSet<AccountTutorial> AccountTutorials { get; set; }
public DbSet<CafeDB> Cafes { get; set; }
public DbSet<FurnitureDB> Furnitures { get; set; }
public static SCHALEContext Create(string connectionString) => public static SCHALEContext Create(string connectionString) =>
new(new DbContextOptionsBuilder<SCHALEContext>() new(new DbContextOptionsBuilder<SCHALEContext>()
.UseSqlServer(connectionString) .UseSqlServer(connectionString)
@ -84,6 +87,16 @@ namespace SCHALE.Common.Database
.WithOne(x => x.Account) .WithOne(x => x.Account)
.HasForeignKey(x => x.AccountServerId) .HasForeignKey(x => x.AccountServerId)
.IsRequired(); .IsRequired();
modelBuilder.Entity<AccountDB>()
.HasMany(x => x.Cafes)
.WithOne(x => x.Account)
.HasForeignKey(x => x.AccountServerId)
.IsRequired();
modelBuilder.Entity<AccountDB>()
.HasMany(x => x.Furnitures)
.WithOne(x => x.Account)
.HasForeignKey(x => x.AccountServerId)
.IsRequired();
modelBuilder.Entity<AccountDB>(x => x.Property(b => b.RaidInfo).HasJsonConversion()); modelBuilder.Entity<AccountDB>(x => x.Property(b => b.RaidInfo).HasJsonConversion());
modelBuilder.Entity<ItemDB>().Property(x => x.ServerId).ValueGeneratedOnAdd(); modelBuilder.Entity<ItemDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
@ -93,6 +106,14 @@ namespace SCHALE.Common.Database
modelBuilder.Entity<EchelonDB>().Property(x => x.ServerId).ValueGeneratedOnAdd(); modelBuilder.Entity<EchelonDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
modelBuilder.Entity<CafeDB>().Property(x => x.CafeDBId).ValueGeneratedOnAdd();
modelBuilder.Entity<CafeDB>().Property(x => x.CafeVisitCharacterDBs).HasJsonConversion();
modelBuilder.Entity<CafeDB>().Property(x => x.CurrencyDict_Obsolete).HasJsonConversion();
modelBuilder.Entity<CafeDB>().Property(x => x.UpdateTimeDict_Obsolete).HasJsonConversion();
modelBuilder.Entity<FurnitureDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
modelBuilder.Entity<CharacterDB>().Property(x => x.ServerId).ValueGeneratedOnAdd(); modelBuilder.Entity<CharacterDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
modelBuilder.Entity<CharacterDB>().Property(x => x.EquipmentSlotAndDBIds).HasJsonConversion(); modelBuilder.Entity<CharacterDB>().Property(x => x.EquipmentSlotAndDBIds).HasJsonConversion();
modelBuilder.Entity<CharacterDB>().Property(x => x.PotentialStats).HasJsonConversion(); modelBuilder.Entity<CharacterDB>().Property(x => x.PotentialStats).HasJsonConversion();

View File

@ -349,6 +349,13 @@ namespace SCHALE.Common.Database
[JsonIgnore] [JsonIgnore]
public virtual ICollection<ScenarioHistoryDB> Scenarios { get; } public virtual ICollection<ScenarioHistoryDB> Scenarios { get; }
[JsonIgnore]
public virtual ICollection<CafeDB> Cafes { get; }
[JsonIgnore]
public virtual ICollection<FurnitureDB> Furnitures { get; }
[JsonIgnore] [JsonIgnore]
public virtual RaidInfo RaidInfo { get; set; } public virtual RaidInfo RaidInfo { get; set; }
@ -362,6 +369,8 @@ namespace SCHALE.Common.Database
Gears = new List<GearDB>(); Gears = new List<GearDB>();
MemoryLobbies = new List<MemoryLobbyDB>(); MemoryLobbies = new List<MemoryLobbyDB>();
Scenarios = new List<ScenarioHistoryDB>(); Scenarios = new List<ScenarioHistoryDB>();
Cafes = new List<CafeDB>();
Furnitures = new List<FurnitureDB>();
} }
public AccountDB(long publisherAccountId) : this() public AccountDB(long publisherAccountId) : this()
@ -605,8 +614,17 @@ namespace SCHALE.Common.Database
public class CafeDB public class CafeDB
{ {
[JsonIgnore]
public virtual AccountDB Account { get; set; }
[JsonIgnore]
public long AccountServerId { get; set; }
[Key]
public long CafeDBId { get; set; } public long CafeDBId { get; set; }
public long CafeId { get; set; } public long CafeId { get; set; }
public long AccountId { get; set; } public long AccountId { get; set; }
public int CafeRank { get; set; } public int CafeRank { get; set; }
public DateTime LastUpdate { get; set; } public DateTime LastUpdate { get; set; }
@ -615,11 +633,30 @@ namespace SCHALE.Common.Database
[NotMapped] [NotMapped]
public bool IsNew { get; set; } public bool IsNew { get; set; }
public Dictionary<long, CafeCharacterDB> CafeVisitCharacterDBs { get; set; } public Dictionary<long, CafeCharacterDB> CafeVisitCharacterDBs { get; set; }
public List<FurnitureDB> FurnitureDBs { get; set; }
public DateTime ProductionAppliedTime { get; set; } public DateTime ProductionAppliedTime { get; set; }
public CafeProductionDB ProductionDB { get; set; }
public Dictionary<CurrencyTypes, long> CurrencyDict_Obsolete { get; set; }
public Dictionary<CurrencyTypes, DateTime> UpdateTimeDict_Obsolete { get; set; } [NotMapped]
public List<FurnitureDB> FurnitureDBs { get => Account.Furnitures.Where(x => x.CafeDBId == CafeDBId).ToList(); }
// TODO: fix this, probably needs another db for this, and link in OnModelCreate
[NotMapped]
public CafeProductionDB ProductionDB
{
get => new()
{
CafeDBId = 1,
AppliedDate = DateTime.UtcNow,
ProductionParcelInfos = [
new() { Key = { Type = ParcelType.Currency, Id = 1 } }, // id 1
new() { Key = { Type = ParcelType.Currency, Id = 5 } }
],
};
}
public Dictionary<CurrencyTypes, long> CurrencyDict_Obsolete { get; set; } = new Dictionary<CurrencyTypes, long>();
public Dictionary<CurrencyTypes, DateTime> UpdateTimeDict_Obsolete { get; set; } = new Dictionary<CurrencyTypes, DateTime>();
} }
public class CafeProductionParcelInfo public class CafeProductionParcelInfo
@ -1579,6 +1616,7 @@ namespace SCHALE.Common.Database
{ {
public override ParcelType Type { get => ParcelType.Furniture; } public override ParcelType Type { get => ParcelType.Furniture; }
[NotMapped]
[JsonIgnore] [JsonIgnore]
public override IEnumerable<ParcelInfo> ParcelInfos { get; } public override IEnumerable<ParcelInfo> ParcelInfos { get; }

View File

@ -0,0 +1,713 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SCHALE.Common.Database;
#nullable disable
namespace SCHALE.Common.Migrations.SqlServerMigrations
{
[DbContext(typeof(SCHALEContext))]
[Migration("20241108220342_CafeAndFurnitures")]
partial class CafeAndFurnitures
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.6")
.HasAnnotation("Proxies:ChangeTracking", false)
.HasAnnotation("Proxies:CheckEquality", false)
.HasAnnotation("Proxies:LazyLoading", true)
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("SCHALE.Common.Database.AccountDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<DateTime?>("BirthDay")
.HasColumnType("datetime2");
b.Property<string>("CallName")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("CallNameUpdateTime")
.HasColumnType("datetime2");
b.Property<string>("Comment")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("CreateDate")
.HasColumnType("datetime2");
b.Property<string>("DevId")
.HasColumnType("nvarchar(max)");
b.Property<long>("Exp")
.HasColumnType("bigint");
b.Property<DateTime>("LastConnectTime")
.HasColumnType("datetime2");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<DateTime?>("LinkRewardDate")
.HasColumnType("datetime2");
b.Property<int>("LobbyMode")
.HasColumnType("int");
b.Property<long>("MemoryLobbyUniqueId")
.HasColumnType("bigint");
b.Property<string>("Nickname")
.HasColumnType("nvarchar(max)");
b.Property<long>("PublisherAccountId")
.HasColumnType("bigint");
b.Property<string>("RaidInfo")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("RepresentCharacterServerId")
.HasColumnType("int");
b.Property<int?>("RetentionDays")
.HasColumnType("int");
b.Property<int>("State")
.HasColumnType("int");
b.Property<int?>("UnReadMailCount")
.HasColumnType("int");
b.Property<int?>("VIPLevel")
.HasColumnType("int");
b.HasKey("ServerId");
b.ToTable("Accounts");
});
modelBuilder.Entity("SCHALE.Common.Database.CafeDB", b =>
{
b.Property<long>("CafeDBId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("CafeDBId"));
b.Property<long>("AccountId")
.HasColumnType("bigint");
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("CafeId")
.HasColumnType("bigint");
b.Property<int>("CafeRank")
.HasColumnType("int");
b.Property<string>("CafeVisitCharacterDBs")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("CurrencyDict_Obsolete")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("LastSummonDate")
.HasColumnType("datetime2");
b.Property<DateTime>("LastUpdate")
.HasColumnType("datetime2");
b.Property<DateTime>("ProductionAppliedTime")
.HasColumnType("datetime2");
b.Property<string>("UpdateTimeDict_Obsolete")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("CafeDBId");
b.HasIndex("AccountServerId");
b.ToTable("Cafes");
});
modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<string>("EquipmentServerIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("EquipmentSlotAndDBIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("ExSkillLevel")
.HasColumnType("int");
b.Property<long>("Exp")
.HasColumnType("bigint");
b.Property<int>("ExtraPassiveSkillLevel")
.HasColumnType("int");
b.Property<long>("FavorExp")
.HasColumnType("bigint");
b.Property<int>("FavorRank")
.HasColumnType("int");
b.Property<bool>("IsFavorite")
.HasColumnType("bit");
b.Property<bool>("IsLocked")
.HasColumnType("bit");
b.Property<int>("LeaderSkillLevel")
.HasColumnType("int");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<int>("PassiveSkillLevel")
.HasColumnType("int");
b.Property<string>("PotentialStats")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("PublicSkillLevel")
.HasColumnType("int");
b.Property<int>("StarGrade")
.HasColumnType("int");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Characters");
});
modelBuilder.Entity("SCHALE.Common.Database.EchelonDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<string>("CombatStyleIndex")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<long>("EchelonNumber")
.HasColumnType("bigint");
b.Property<int>("EchelonType")
.HasColumnType("int");
b.Property<int>("ExtensionType")
.HasColumnType("int");
b.Property<long>("LeaderServerId")
.HasColumnType("bigint");
b.Property<string>("MainSlotServerIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("SkillCardMulliganCharacterIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("SupportSlotServerIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<long>("TSSInteractionServerId")
.HasColumnType("bigint");
b.Property<int>("UsingFlag")
.HasColumnType("int");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Echelons");
});
modelBuilder.Entity("SCHALE.Common.Database.EquipmentDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("BoundCharacterServerId")
.HasColumnType("bigint");
b.Property<long>("Exp")
.HasColumnType("bigint");
b.Property<bool>("IsLocked")
.HasColumnType("bit");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<long>("StackCount")
.HasColumnType("bigint");
b.Property<int>("Tier")
.HasColumnType("int");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Equipment");
});
modelBuilder.Entity("SCHALE.Common.Database.FurnitureDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("CafeDBId")
.HasColumnType("bigint");
b.Property<long>("ItemDeploySequence")
.HasColumnType("bigint");
b.Property<int>("Location")
.HasColumnType("int");
b.Property<float>("PositionX")
.HasColumnType("real");
b.Property<float>("PositionY")
.HasColumnType("real");
b.Property<float>("Rotation")
.HasColumnType("real");
b.Property<long>("StackCount")
.HasColumnType("bigint");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Furnitures");
});
modelBuilder.Entity("SCHALE.Common.Database.GearDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("BoundCharacterServerId")
.HasColumnType("bigint");
b.Property<long>("Exp")
.HasColumnType("bigint");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<long>("SlotIndex")
.HasColumnType("bigint");
b.Property<int>("Tier")
.HasColumnType("int");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Gears");
});
modelBuilder.Entity("SCHALE.Common.Database.ItemDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<bool>("IsLocked")
.HasColumnType("bit");
b.Property<long>("StackCount")
.HasColumnType("bigint");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Items");
});
modelBuilder.Entity("SCHALE.Common.Database.MemoryLobbyDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("MemoryLobbyUniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("MemoryLobbies");
});
modelBuilder.Entity("SCHALE.Common.Database.MissionProgressDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<bool>("Complete")
.HasColumnType("bit");
b.Property<long>("MissionUniqueId")
.HasColumnType("bigint");
b.Property<string>("ProgressParameters")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("StartTime")
.HasColumnType("datetime2");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("MissionProgresses");
});
modelBuilder.Entity("SCHALE.Common.Database.Models.AccountTutorial", b =>
{
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<string>("TutorialIds")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("AccountServerId");
b.ToTable("AccountTutorials");
});
modelBuilder.Entity("SCHALE.Common.Database.Models.GuestAccount", b =>
{
b.Property<long>("Uid")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Uid"));
b.Property<string>("DeviceId")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Token")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Uid");
b.ToTable("GuestAccounts");
});
modelBuilder.Entity("SCHALE.Common.Database.ScenarioHistoryDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<DateTime>("ClearDateTime")
.HasColumnType("datetime2");
b.Property<long>("ScenarioUniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Scenarios");
});
modelBuilder.Entity("SCHALE.Common.Database.WeaponDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("BoundCharacterServerId")
.HasColumnType("bigint");
b.Property<long>("Exp")
.HasColumnType("bigint");
b.Property<bool>("IsLocked")
.HasColumnType("bit");
b.Property<int>("Level")
.HasColumnType("int");
b.Property<int>("StarGrade")
.HasColumnType("int");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Weapons");
});
modelBuilder.Entity("SCHALE.Common.Database.CafeDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Cafes")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Characters")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.EchelonDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Echelons")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.EquipmentDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Equipment")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.FurnitureDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Furnitures")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.GearDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Gears")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.ItemDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Items")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.MemoryLobbyDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("MemoryLobbies")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.MissionProgressDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("MissionProgresses")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.ScenarioHistoryDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Scenarios")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.WeaponDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Weapons")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.AccountDB", b =>
{
b.Navigation("Cafes");
b.Navigation("Characters");
b.Navigation("Echelons");
b.Navigation("Equipment");
b.Navigation("Furnitures");
b.Navigation("Gears");
b.Navigation("Items");
b.Navigation("MemoryLobbies");
b.Navigation("MissionProgresses");
b.Navigation("Scenarios");
b.Navigation("Weapons");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,90 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace SCHALE.Common.Migrations.SqlServerMigrations
{
/// <inheritdoc />
public partial class CafeAndFurnitures : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Cafes",
columns: table => new
{
CafeDBId = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
AccountServerId = table.Column<long>(type: "bigint", nullable: false),
CafeId = table.Column<long>(type: "bigint", nullable: false),
AccountId = table.Column<long>(type: "bigint", nullable: false),
CafeRank = table.Column<int>(type: "int", nullable: false),
LastUpdate = table.Column<DateTime>(type: "datetime2", nullable: false),
LastSummonDate = table.Column<DateTime>(type: "datetime2", nullable: true),
CafeVisitCharacterDBs = table.Column<string>(type: "nvarchar(max)", nullable: false),
ProductionAppliedTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CurrencyDict_Obsolete = table.Column<string>(type: "nvarchar(max)", nullable: false),
UpdateTimeDict_Obsolete = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Cafes", x => x.CafeDBId);
table.ForeignKey(
name: "FK_Cafes_Accounts_AccountServerId",
column: x => x.AccountServerId,
principalTable: "Accounts",
principalColumn: "ServerId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Furnitures",
columns: table => new
{
ServerId = table.Column<long>(type: "bigint", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Location = table.Column<int>(type: "int", nullable: false),
CafeDBId = table.Column<long>(type: "bigint", nullable: false),
PositionX = table.Column<float>(type: "real", nullable: false),
PositionY = table.Column<float>(type: "real", nullable: false),
Rotation = table.Column<float>(type: "real", nullable: false),
ItemDeploySequence = table.Column<long>(type: "bigint", nullable: false),
AccountServerId = table.Column<long>(type: "bigint", nullable: false),
UniqueId = table.Column<long>(type: "bigint", nullable: false),
StackCount = table.Column<long>(type: "bigint", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Furnitures", x => x.ServerId);
table.ForeignKey(
name: "FK_Furnitures_Accounts_AccountServerId",
column: x => x.AccountServerId,
principalTable: "Accounts",
principalColumn: "ServerId",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Cafes_AccountServerId",
table: "Cafes",
column: "AccountServerId");
migrationBuilder.CreateIndex(
name: "IX_Furnitures_AccountServerId",
table: "Furnitures",
column: "AccountServerId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Cafes");
migrationBuilder.DropTable(
name: "Furnitures");
}
}
}

View File

@ -17,7 +17,7 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("ProductVersion", "8.0.6")
.HasAnnotation("Proxies:ChangeTracking", false) .HasAnnotation("Proxies:ChangeTracking", false)
.HasAnnotation("Proxies:CheckEquality", false) .HasAnnotation("Proxies:CheckEquality", false)
.HasAnnotation("Proxies:LazyLoading", true) .HasAnnotation("Proxies:LazyLoading", true)
@ -99,6 +99,54 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
b.ToTable("Accounts"); b.ToTable("Accounts");
}); });
modelBuilder.Entity("SCHALE.Common.Database.CafeDB", b =>
{
b.Property<long>("CafeDBId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("CafeDBId"));
b.Property<long>("AccountId")
.HasColumnType("bigint");
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("CafeId")
.HasColumnType("bigint");
b.Property<int>("CafeRank")
.HasColumnType("int");
b.Property<string>("CafeVisitCharacterDBs")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("CurrencyDict_Obsolete")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("LastSummonDate")
.HasColumnType("datetime2");
b.Property<DateTime>("LastUpdate")
.HasColumnType("datetime2");
b.Property<DateTime>("ProductionAppliedTime")
.HasColumnType("datetime2");
b.Property<string>("UpdateTimeDict_Obsolete")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("CafeDBId");
b.HasIndex("AccountServerId");
b.ToTable("Cafes");
});
modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b => modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b =>
{ {
b.Property<long>("ServerId") b.Property<long>("ServerId")
@ -259,6 +307,48 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
b.ToTable("Equipment"); b.ToTable("Equipment");
}); });
modelBuilder.Entity("SCHALE.Common.Database.FurnitureDB", b =>
{
b.Property<long>("ServerId")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ServerId"));
b.Property<long>("AccountServerId")
.HasColumnType("bigint");
b.Property<long>("CafeDBId")
.HasColumnType("bigint");
b.Property<long>("ItemDeploySequence")
.HasColumnType("bigint");
b.Property<int>("Location")
.HasColumnType("int");
b.Property<float>("PositionX")
.HasColumnType("real");
b.Property<float>("PositionY")
.HasColumnType("real");
b.Property<float>("Rotation")
.HasColumnType("real");
b.Property<long>("StackCount")
.HasColumnType("bigint");
b.Property<long>("UniqueId")
.HasColumnType("bigint");
b.HasKey("ServerId");
b.HasIndex("AccountServerId");
b.ToTable("Furnitures");
});
modelBuilder.Entity("SCHALE.Common.Database.GearDB", b => modelBuilder.Entity("SCHALE.Common.Database.GearDB", b =>
{ {
b.Property<long>("ServerId") b.Property<long>("ServerId")
@ -469,6 +559,17 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
b.ToTable("Weapons"); b.ToTable("Weapons");
}); });
modelBuilder.Entity("SCHALE.Common.Database.CafeDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Cafes")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b => modelBuilder.Entity("SCHALE.Common.Database.CharacterDB", b =>
{ {
b.HasOne("SCHALE.Common.Database.AccountDB", "Account") b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
@ -502,6 +603,17 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
b.Navigation("Account"); b.Navigation("Account");
}); });
modelBuilder.Entity("SCHALE.Common.Database.FurnitureDB", b =>
{
b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
.WithMany("Furnitures")
.HasForeignKey("AccountServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Account");
});
modelBuilder.Entity("SCHALE.Common.Database.GearDB", b => modelBuilder.Entity("SCHALE.Common.Database.GearDB", b =>
{ {
b.HasOne("SCHALE.Common.Database.AccountDB", "Account") b.HasOne("SCHALE.Common.Database.AccountDB", "Account")
@ -570,12 +682,16 @@ namespace SCHALE.Common.Migrations.SqlServerMigrations
modelBuilder.Entity("SCHALE.Common.Database.AccountDB", b => modelBuilder.Entity("SCHALE.Common.Database.AccountDB", b =>
{ {
b.Navigation("Cafes");
b.Navigation("Characters"); b.Navigation("Characters");
b.Navigation("Echelons"); b.Navigation("Echelons");
b.Navigation("Equipment"); b.Navigation("Equipment");
b.Navigation("Furnitures");
b.Navigation("Gears"); b.Navigation("Gears");
b.Navigation("Items"); b.Navigation("Items");

View File

@ -0,0 +1,110 @@
using SCHALE.Common.Database;
using SCHALE.Common.Database.ModelExtensions;
using SCHALE.Common.FlatData;
using SCHALE.Common.Utils;
using SCHALE.GameServer.Controllers.Api.ProtocolHandlers;
using SCHALE.GameServer.Services;
using SCHALE.GameServer.Services.Irc;
namespace SCHALE.GameServer.Commands
{
[CommandHandler("cafe", "Command to manage the cafe", "/cafe <character|furniture> <add|addall|removeall> [id/amount]")]
internal class CafeCommand : Command
{
// /cafe character add 123
// /cafe character addall
// /cafe character removeall
public CafeCommand(IrcConnection connection, string[] args, bool validate = true) : base(connection, args, validate) { }
[Argument(0, @"^character$|^furniture$", "The target type", ArgumentFlags.IgnoreCase)]
public string Type { get; set; } = string.Empty;
[Argument(1, @"^add$|^addall$|^removeall$", "The operation selected (add, addall, removeall)", ArgumentFlags.IgnoreCase)]
public string Op { get; set; } = string.Empty;
[Argument(2, @"^[0-9]+$", "The target character id / the add amount for addall", ArgumentFlags.Optional)]
public string Target { get; set; } = string.Empty;
public override void Execute()
{
var context = connection.Context;
var targetCafe = connection.Account.Cafes.FirstOrDefault();
switch (Type.ToLower())
{
case "character":
{
switch (Op.ToLower())
{
case "add":
{
if (uint.TryParse(Target, out uint characterId))
{
if (!targetCafe.CafeVisitCharacterDBs.ContainsKey(characterId))
{
targetCafe.CafeVisitCharacterDBs.Add(characterId, new CafeCharacterDB() { UniqueId = characterId });
connection.SendChatMessage($"Character {characterId} added to your cafe!");
}
else
{
connection.SendChatMessage("That character is already in the cafe, skipped.");
}
} else
{
connection.SendChatMessage($"Invalid character id");
}
break;
}
case "addall":
{
int amount = 50;
if (int.TryParse(Target, out int targetAmount))
{
amount = targetAmount;
}
var characterExcel = connection.ExcelTableService.GetTable<CharacterExcelTable>().UnPack().DataList;
var allCharacters = characterExcel.Where(x =>
x is
{
IsPlayable: true,
IsPlayableCharacter: true,
IsNpc: false,
ProductionStep: ProductionStep.Release,
}
).Select(x => x.Id).ToList();
var cafeVisitCharacterDBs = allCharacters.Take(amount).ToDictionary(id => id, id => new CafeCharacterDB { UniqueId = id });
targetCafe.CafeVisitCharacterDBs = cafeVisitCharacterDBs;
connection.SendChatMessage($"Added {amount} characters to your cafe!");
break;
}
case "removeall":
{
targetCafe.CafeVisitCharacterDBs = new Dictionary<long, CafeCharacterDB>();
connection.SendChatMessage("Removed all characters from your cafe!");
break;
}
}
break;
}
}
context.SaveChanges();
}
}
}

View File

@ -3,6 +3,8 @@ using SCHALE.Common.Database.ModelExtensions;
using SCHALE.Common.FlatData; using SCHALE.Common.FlatData;
using SCHALE.Common.NetworkProtocol; using SCHALE.Common.NetworkProtocol;
using SCHALE.GameServer.Services; using SCHALE.GameServer.Services;
using Serilog;
using System.Globalization;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
@ -255,6 +257,27 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
} }
context.SaveChanges(); context.SaveChanges();
// Default cafe
CafeDB defaultCafe = new CafeDB()
{
CafeId = 1,
CafeRank = 1,
AccountId = account.ServerId,
LastUpdate = DateTime.UtcNow,
LastSummonDate = DateTime.UtcNow,
IsNew = true,
CafeVisitCharacterDBs = GetRandomCharactersId(5).ToDictionary(id => id, id => new CafeCharacterDB { UniqueId = id, ServerId = id }),
ProductionAppliedTime = DateTime.UtcNow,
//ProductionDB =
};
var defaultFurnitures = GetDefaultFurnitures(1);
account.AddCafes(context, [defaultCafe]);
account.AddFurnitures(context, [.. defaultFurnitures]);
context.SaveChanges();
return new AccountCreateResponse() return new AccountCreateResponse()
{ {
SessionKey = sessionKeyService.Create(account.PublisherAccountId) SessionKey = sessionKeyService.Create(account.PublisherAccountId)
@ -282,63 +305,8 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
{ {
CafeGetInfoResponse = new CafeGetInfoResponse() CafeGetInfoResponse = new CafeGetInfoResponse()
{ {
CafeDBs = [ CafeDBs = [.. account.Cafes],
new CafeDB() { FurnitureDBs = [.. account.Furnitures]
CafeDBId = 3091193,
CafeId = 1,
AccountId = 1,
CafeRank = 1,
LastUpdate = DateTime.Parse("2024-04-21T07: 29: 57"),
LastSummonDate = DateTime.Parse("0001-01-01T00: 00: 00"),
IsNew = true,
CafeVisitCharacterDBs = new Dictionary<long, CafeCharacterDB>()
{
{ 26008, new CafeCharacterDB() { UniqueId = 26008 } },
{ 10005, new CafeCharacterDB() { UniqueId = 10005 } },
{ 13004, new CafeCharacterDB() { UniqueId = 13004 } },
{ 10058, new CafeCharacterDB() { UniqueId = 10058 } },
},
FurnitureDBs = [
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, ItemDeploySequence = 368862451, ServerId = 368862451, UniqueId = 1, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallRight, CafeDBId = 3091193, ItemDeploySequence = 368862452, ServerId = 368862452, UniqueId = 2, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallLeft, CafeDBId = 3091193, ItemDeploySequence = 368862453, ServerId = 368862453, UniqueId = 3, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallRight, CafeDBId = 3091193, PositionX = 8.5f, PositionY = 3.0f, ItemDeploySequence = 368862454, ServerId = 368862454, UniqueId = 4, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 3.0f, PositionY = 1.5f, Rotation = 270.0f, ItemDeploySequence = 368862455, ServerId = 368862455, UniqueId = 5, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862456, ServerId = 368862456, UniqueId = 6, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 6.5f, ItemDeploySequence = 368862457, ServerId = 368862457, UniqueId = 7, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 9.5f, PositionY = 8.5f, ItemDeploySequence = 368862458, ServerId = 368862458, UniqueId = 8, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 4.5f, PositionY = 0.5f, ItemDeploySequence = 368862459, ServerId = 368862459, UniqueId = 9, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862460, ServerId = 368862460, UniqueId = 10, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallLeft, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 3.0f, ItemDeploySequence = 368862461, ServerId = 368862461, UniqueId = 11, StackCount = 1}
],
ProductionAppliedTime = DateTime.Parse("2024-04-21T07: 29: 50"),
ProductionDB = new () {
CafeDBId = 3091193,
AppliedDate = DateTime.Parse("2024-04-21T07: 29: 50"),
ProductionParcelInfos = [
new() { Key = { Type = ParcelType.Currency, Id = 1 } },
new() { Key = { Type = ParcelType.Currency, Id = 5 } }
],
}
},
],
FurnitureDBs = [
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, ItemDeploySequence = 368862451, ServerId = 368862451, UniqueId = 1, StackCount = 1},
new() { Location = FurnitureLocation.WallRight, CafeDBId = 3091193, ItemDeploySequence = 368862452, ServerId = 368862452, UniqueId = 2, StackCount = 1},
new() { Location = FurnitureLocation.WallLeft, CafeDBId = 3091193, ItemDeploySequence = 368862453, ServerId = 368862453, UniqueId = 3, StackCount = 1},
new() { Location = FurnitureLocation.WallRight, CafeDBId = 3091193, PositionX = 8.5f, PositionY = 3.0f, ItemDeploySequence = 368862454, ServerId = 368862454, UniqueId = 4, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 3.0f, PositionY = 1.5f, Rotation = 270.0f, ItemDeploySequence = 368862455, ServerId = 368862455, UniqueId = 5, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862456, ServerId = 368862456, UniqueId = 6, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 6.5f, ItemDeploySequence = 368862457, ServerId = 368862457, UniqueId = 7, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 9.5f, PositionY = 8.5f, ItemDeploySequence = 368862458, ServerId = 368862458, UniqueId = 8, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 4.5f, PositionY = 0.5f, ItemDeploySequence = 368862459, ServerId = 368862459, UniqueId = 9, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862460, ServerId = 368862460, UniqueId = 10, StackCount = 1},
new() { Location = FurnitureLocation.WallLeft, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 3.0f, ItemDeploySequence = 368862461, ServerId = 368862461, UniqueId = 11, StackCount = 1}],
}, },
AccountCurrencySyncResponse = new AccountCurrencySyncResponse() AccountCurrencySyncResponse = new AccountCurrencySyncResponse()
{ {
@ -579,6 +547,66 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
}; };
} }
// Utils stuff
private List<FurnitureDB> GetDefaultFurnitures(int cafeDbId)
{
var defaultFurnitureExcels = excelTableService.GetTable<DefaultFurnitureExcelTable>().UnPack().DataList;
var defaultCharacters = defaultFurnitureExcels.Select((df, i) => new FurnitureDB()
{
CafeDBId = cafeDbId,
Location = df.Location,
ItemDeploySequence = i,
UniqueId = df.Id,
PositionX = RemoveScientificNotation(df.PositionX),
PositionY = RemoveScientificNotation(df.PositionY),
Rotation = RemoveScientificNotation(df.Rotation),
StackCount = 1,
}).ToList();
return defaultCharacters;
}
private List<long> GetRandomCharactersId(int amount)
{
var randomCharacters = new List<long>();
var characterExcel = excelTableService.GetTable<CharacterExcelTable>().UnPack().DataList;
var allCharacters = characterExcel.Where(x => x is
{
IsPlayable: true,
IsPlayableCharacter: true,
IsNpc: false,
ProductionStep: ProductionStep.Release,
}).Select(x => x.Id).ToList();
while (randomCharacters.Count < amount)
{
int randIndex = new Random().Next() % allCharacters.Count;
randomCharacters.Add(allCharacters[randIndex]);
}
return randomCharacters;
}
public static float RemoveScientificNotation(float value)
{
float result = value;
while (result < 1f)
{
result *= 10.0f;
}
while (result > 19.0f)
{
result /= 10.0f;
}
return result;
}
// TODO: others handlers, move to different handler group later // TODO: others handlers, move to different handler group later
[ProtocolHandler(Protocol.NetworkTime_Sync)] [ProtocolHandler(Protocol.NetworkTime_Sync)]
public ResponsePacket NetworkTime_SyncHandler(NetworkTimeSyncRequest req) public ResponsePacket NetworkTime_SyncHandler(NetworkTimeSyncRequest req)
@ -679,112 +707,5 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
{ {
return new FriendGetIdCardResponse(); return new FriendGetIdCardResponse();
} }
[ProtocolHandler(Protocol.Cafe_Get)]
public ResponsePacket Cafe_Get(CafeGetInfoRequest req)
{
List<CafeDB> cafeDBs = [
new CafeDB() {
CafeDBId = 3091193,
CafeId = 1,
AccountId = 1,
CafeRank = 1,
LastUpdate = DateTime.Parse("2024-04-21T07: 29: 57"),
LastSummonDate = DateTime.Parse("0001-01-01T00: 00: 00"),
IsNew = true,
CafeVisitCharacterDBs = new Dictionary<long, CafeCharacterDB>()
{
{ 26008, new CafeCharacterDB() { UniqueId = 26008 } },
{ 10005, new CafeCharacterDB() { UniqueId = 10005 } },
{ 13004, new CafeCharacterDB() { UniqueId = 13004 } },
{ 10058, new CafeCharacterDB() { UniqueId = 10058 } },
},
FurnitureDBs = [
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, ItemDeploySequence = 368862451, ServerId = 368862451, UniqueId = 1, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallRight, CafeDBId = 3091193, ItemDeploySequence = 368862452, ServerId = 368862452, UniqueId = 2, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallLeft, CafeDBId = 3091193, ItemDeploySequence = 368862453, ServerId = 368862453, UniqueId = 3, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallRight, CafeDBId = 3091193, PositionX = 8.5f, PositionY = 3.0f, ItemDeploySequence = 368862454, ServerId = 368862454, UniqueId = 4, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 3.0f, PositionY = 1.5f, Rotation = 270.0f, ItemDeploySequence = 368862455, ServerId = 368862455, UniqueId = 5, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862456, ServerId = 368862456, UniqueId = 6, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 6.5f, ItemDeploySequence = 368862457, ServerId = 368862457, UniqueId = 7, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 9.5f, PositionY = 8.5f, ItemDeploySequence = 368862458, ServerId = 368862458, UniqueId = 8, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 4.5f, PositionY = 0.5f, ItemDeploySequence = 368862459, ServerId = 368862459, UniqueId = 9, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862460, ServerId = 368862460, UniqueId = 10, StackCount = 1},
new() { Location = Common.FlatData.FurnitureLocation.WallLeft, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 3.0f, ItemDeploySequence = 368862461, ServerId = 368862461, UniqueId = 11, StackCount = 1}
],
ProductionAppliedTime = DateTime.Parse("2024-04-21T07: 29: 50"),
ProductionDB = new () {
CafeDBId = 3091193,
AppliedDate = DateTime.Parse("2024-04-21T07: 29: 50"),
ProductionParcelInfos = [
new() { Key = { Type = ParcelType.Currency, Id = 1 } },
new() { Key = { Type = ParcelType.Currency, Id = 5 } }
],
}
},
];
var characterExcel = excelTableService.GetTable<CharacterExcelTable>().UnPack().DataList;
var allCharacters = characterExcel.Where(x =>
x is
{
IsPlayable: true,
IsPlayableCharacter: true,
IsNpc: false,
ProductionStep: ProductionStep.Release,
}
).Select(x => x.Id).ToList();
var cafeVisitCharacterDBs = allCharacters.Take(10).ToDictionary(id => id, id => new CafeCharacterDB { UniqueId = id });
//cafeVisitCharacterDBs.Add(1, new CafeCharacterDB());
cafeDBs[0].CafeVisitCharacterDBs = cafeVisitCharacterDBs;
return new CafeGetInfoResponse()
{
CafeDBs = cafeDBs,
FurnitureDBs = [
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, ItemDeploySequence = 368862451, ServerId = 368862451, UniqueId = 1, StackCount = 1},
new() { Location = FurnitureLocation.WallRight, CafeDBId = 3091193, ItemDeploySequence = 368862452, ServerId = 368862452, UniqueId = 2, StackCount = 1},
new() { Location = FurnitureLocation.WallLeft, CafeDBId = 3091193, ItemDeploySequence = 368862453, ServerId = 368862453, UniqueId = 3, StackCount = 1},
new() { Location = FurnitureLocation.WallRight, CafeDBId = 3091193, PositionX = 8.5f, PositionY = 3.0f, ItemDeploySequence = 368862454, ServerId = 368862454, UniqueId = 4, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 3.0f, PositionY = 1.5f, Rotation = 270.0f, ItemDeploySequence = 368862455, ServerId = 368862455, UniqueId = 5, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862456, ServerId = 368862456, UniqueId = 6, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 6.5f, ItemDeploySequence = 368862457, ServerId = 368862457, UniqueId = 7, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 9.5f, PositionY = 8.5f, ItemDeploySequence = 368862458, ServerId = 368862458, UniqueId = 8, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 4.5f, PositionY = 0.5f, ItemDeploySequence = 368862459, ServerId = 368862459, UniqueId = 9, StackCount = 1},
new() { Location = FurnitureLocation.Floor, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 8.5f, ItemDeploySequence = 368862460, ServerId = 368862460, UniqueId = 10, StackCount = 1},
new() { Location = FurnitureLocation.WallLeft, CafeDBId = 3091193, PositionX = 7.5f, PositionY = 3.0f, ItemDeploySequence = 368862461, ServerId = 368862461, UniqueId = 11, StackCount = 1}],
};
}
[ProtocolHandler(Protocol.Cafe_Ack)]
public ResponsePacket Cafe_Ack(CafeAckRequest req)
{
return new CafeAckResponse();
}
[ProtocolHandler(Protocol.Cafe_Open)]
public ResponsePacket Cafe_Open(CafeOpenRequest req)
{
return new CafeOpenResponse();
}
[ProtocolHandler(Protocol.Cafe_Interact)]
public ResponsePacket Cafe_Interact(CafeInteractWithCharacterRequest req)
{
return new CafeInteractWithCharacterResponse();
}
} }
} }

View File

@ -0,0 +1,83 @@
using Microsoft.IdentityModel.Tokens;
using SCHALE.Common.Database;
using SCHALE.Common.Database.ModelExtensions;
using SCHALE.Common.FlatData;
using SCHALE.Common.NetworkProtocol;
using SCHALE.GameServer.Services;
using Serilog;
using System.Transactions;
namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
{
public class Cafe : ProtocolHandlerBase
{
private readonly ISessionKeyService sessionKeyService;
private readonly SCHALEContext context;
private readonly ExcelTableService excelTableService;
public Cafe(IProtocolHandlerFactory protocolHandlerFactory, ISessionKeyService _sessionKeyService, SCHALEContext _context, ExcelTableService _excelTableService) : base(protocolHandlerFactory)
{
sessionKeyService = _sessionKeyService;
context = _context;
excelTableService = _excelTableService;
}
[ProtocolHandler(Protocol.Cafe_Get)]
public ResponsePacket Cafe_Get(CafeGetInfoRequest req)
{
var account = sessionKeyService.GetAccount(req.SessionKey);
return new CafeGetInfoResponse()
{
CafeDBs = [.. account.Cafes],
FurnitureDBs = [.. account.Furnitures]
};
}
[ProtocolHandler(Protocol.Cafe_Ack)]
public ResponsePacket AckHandler(CafeAckRequest req)
{
return new CafeAckResponse();
}
[ProtocolHandler(Protocol.Cafe_Open)]
public ResponsePacket OpenHandler(CafeOpenRequest req)
{
return new CafeOpenResponse();
}
[ProtocolHandler(Protocol.Cafe_Interact)]
public ResponsePacket InteractHandler(CafeInteractWithCharacterRequest req)
{
return new CafeInteractWithCharacterResponse();
}
[ProtocolHandler(Protocol.Cafe_Relocate)]
public ResponsePacket RelocateHandler(CafeRelocateFurnitureRequest req)
{
var account = sessionKeyService.GetAccount(req.SessionKey);
var targetCafe = account.Cafes.Where(x => x.CafeDBId == req.CafeDBId).SingleOrDefault();
var targetFurniture = targetCafe.FurnitureDBs.Where(x => x.CafeDBId == req.CafeDBId && x.ServerId == req.FurnitureDB.ServerId).SingleOrDefault();
if (targetFurniture == null)
{
Log.Error("Target Furniture with Id: " + req.FurnitureDB.ServerId + " was not found.");
return new ErrorPacket();
}
targetFurniture.PositionX = req.FurnitureDB.PositionX;
targetFurniture.PositionY = req.FurnitureDB.PositionY;
targetFurniture.Rotation = req.FurnitureDB.Rotation;
context.SaveChanges();
return new CafeRelocateFurnitureResponse()
{
CafeDB = targetCafe,
RelocatedFurnitureDB = targetFurniture,
};
}
}
}