add config for irc, geardb management
This commit is contained in:
parent
abe0581f7b
commit
7ad2f87d6b
|
@ -51,5 +51,19 @@
|
|||
|
||||
return [.. items];
|
||||
}
|
||||
|
||||
public static List<GearDB> AddGears(this AccountDB account, SCHALEContext context, params GearDB[] gears)
|
||||
{
|
||||
foreach (var gear in gears)
|
||||
{
|
||||
gear.AccountServerId = account.ServerId;
|
||||
context.Gears.Add(gear);
|
||||
|
||||
var targetCharacter = account.Characters.FirstOrDefault(x => x.ServerId == gear.BoundCharacterServerId);
|
||||
targetCharacter.EquipmentServerIds.Add(gear.ServerId);
|
||||
}
|
||||
|
||||
return [.. gears];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace SCHALE.Common.Database
|
|||
public DbSet<CharacterDB> Characters { get; set; }
|
||||
public DbSet<EquipmentDB> Equipment { get; set; }
|
||||
public DbSet<WeaponDB> Weapons { get; set; }
|
||||
public DbSet<GearDB> Gears { get; set; }
|
||||
|
||||
public DbSet<EchelonDB> Echelons { get; set; }
|
||||
public DbSet<AccountTutorial> AccountTutorials { get; set; }
|
||||
|
@ -62,10 +63,16 @@ namespace SCHALE.Common.Database
|
|||
.WithOne(x => x.Account)
|
||||
.HasForeignKey(x => x.AccountServerId)
|
||||
.IsRequired();
|
||||
modelBuilder.Entity<AccountDB>()
|
||||
.HasMany(x => x.Gears)
|
||||
.WithOne(x => x.Account)
|
||||
.HasForeignKey(x => x.AccountServerId)
|
||||
.IsRequired();
|
||||
|
||||
modelBuilder.Entity<ItemDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<EquipmentDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<WeaponDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<GearDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
|
||||
|
||||
modelBuilder.Entity<EchelonDB>().Property(x => x.ServerId).ValueGeneratedOnAdd();
|
||||
|
||||
|
|
|
@ -209,6 +209,10 @@ namespace SCHALE.Common.Database
|
|||
[JsonIgnore]
|
||||
public virtual ICollection<WeaponDB> Weapons { get; }
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual ICollection<GearDB> Gears { get; }
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
public long RaidSeasonId { get; set; } // idk where to store this
|
||||
|
||||
|
@ -1094,7 +1098,7 @@ namespace SCHALE.Common.Database
|
|||
}
|
||||
|
||||
|
||||
public class EliminateRaidLobbyInfoDB
|
||||
public class EliminateRaidLobbyInfoDB : RaidLobbyInfoDB
|
||||
{
|
||||
public List<string> OpenedBossGroups { get; set; }
|
||||
public Dictionary<string, long> BestRankingPointPerBossGroup { get; set; }
|
||||
|
@ -1456,19 +1460,44 @@ namespace SCHALE.Common.Database
|
|||
|
||||
public class GearDB : ParcelBase
|
||||
{
|
||||
[NotMapped]
|
||||
public override ParcelType Type { get => ParcelType.CharacterGear; }
|
||||
|
||||
[NotMapped]
|
||||
[JsonIgnore]
|
||||
public override IEnumerable<ParcelInfo> ParcelInfos { get; }
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual AccountDB Account { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public long AccountServerId { get; set; }
|
||||
|
||||
[Key]
|
||||
public long ServerId { get; set; }
|
||||
|
||||
|
||||
public long UniqueId { get; set; }
|
||||
public int Level { get; set; }
|
||||
public long Exp { get; set; }
|
||||
public int Tier { get; set; }
|
||||
public long SlotIndex { get; set; }
|
||||
public long BoundCharacterServerId { get; set; }
|
||||
public EquipmentDB ToEquipmentDB { get; set; }
|
||||
|
||||
[NotMapped]
|
||||
public EquipmentDB ToEquipmentDB { get {
|
||||
return new()
|
||||
{
|
||||
IsNew = true,
|
||||
ServerId = ServerId,
|
||||
BoundCharacterServerId = BoundCharacterServerId,
|
||||
Tier = Tier,
|
||||
Level = Level,
|
||||
StackCount = 1,
|
||||
Exp = Exp
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1895,6 +1924,7 @@ namespace SCHALE.Common.Database
|
|||
public DateTime NextSeasonEndDate { get; set; }
|
||||
public DateTime NextSettlementEndDate { get; set; }
|
||||
public ClanAssistUseInfo ClanAssistUseInfo { get; set; }
|
||||
public Dictionary<int, bool> RemainFailCompensation { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,521 @@
|
|||
// <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
|
||||
{
|
||||
[DbContext(typeof(SCHALEContext))]
|
||||
[Migration("20240518014039_Gears")]
|
||||
partial class Gears
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "8.0.2")
|
||||
.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<long>("RaidSeasonId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
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.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<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.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.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.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.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.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.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.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("Characters");
|
||||
|
||||
b.Navigation("Echelons");
|
||||
|
||||
b.Navigation("Equipment");
|
||||
|
||||
b.Navigation("Gears");
|
||||
|
||||
b.Navigation("Items");
|
||||
|
||||
b.Navigation("MissionProgresses");
|
||||
|
||||
b.Navigation("Weapons");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace SCHALE.Common.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class Gears : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Gears",
|
||||
columns: table => new
|
||||
{
|
||||
ServerId = table.Column<long>(type: "bigint", nullable: false)
|
||||
.Annotation("SqlServer:Identity", "1, 1"),
|
||||
AccountServerId = table.Column<long>(type: "bigint", nullable: false),
|
||||
UniqueId = table.Column<long>(type: "bigint", nullable: false),
|
||||
Level = table.Column<int>(type: "int", nullable: false),
|
||||
Exp = table.Column<long>(type: "bigint", nullable: false),
|
||||
Tier = table.Column<int>(type: "int", nullable: false),
|
||||
SlotIndex = table.Column<long>(type: "bigint", nullable: false),
|
||||
BoundCharacterServerId = table.Column<long>(type: "bigint", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Gears", x => x.ServerId);
|
||||
table.ForeignKey(
|
||||
name: "FK_Gears_Accounts_AccountServerId",
|
||||
column: x => x.AccountServerId,
|
||||
principalTable: "Accounts",
|
||||
principalColumn: "ServerId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Gears_AccountServerId",
|
||||
table: "Gears",
|
||||
column: "AccountServerId");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Gears");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -254,6 +254,42 @@ namespace SCHALE.Common.Migrations
|
|||
b.ToTable("Equipment");
|
||||
});
|
||||
|
||||
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")
|
||||
|
@ -416,6 +452,17 @@ namespace SCHALE.Common.Migrations
|
|||
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")
|
||||
|
@ -457,6 +504,8 @@ namespace SCHALE.Common.Migrations
|
|||
|
||||
b.Navigation("Equipment");
|
||||
|
||||
b.Navigation("Gears");
|
||||
|
||||
b.Navigation("Items");
|
||||
|
||||
b.Navigation("MissionProgresses");
|
||||
|
|
|
@ -6,12 +6,12 @@ using SCHALE.GameServer.Services.Irc;
|
|||
|
||||
namespace SCHALE.GameServer.Commands
|
||||
{
|
||||
[CommandHandler("inventory", "Command to manage inventory (chars, weapons, equipment, items)", "/inventory <addall|clearall>")]
|
||||
[CommandHandler("inventory", "Command to manage inventory (chars, weapons, equipment, items)", "/inventory <addall|removeall>")]
|
||||
internal class InventoryCommand : Command
|
||||
{
|
||||
public InventoryCommand(IrcConnection connection, string[] args, bool validate = true) : base(connection, args, validate) { }
|
||||
|
||||
[Argument(0, @"^addall$|^clearall$", "The operation selected (addall, clearall)", ArgumentFlags.IgnoreCase)]
|
||||
[Argument(0, @"^addall$|^removeall$", "The operation selected (addall, removeall)", ArgumentFlags.IgnoreCase)]
|
||||
public string Op { get; set; } = string.Empty;
|
||||
|
||||
public override void Execute()
|
||||
|
@ -25,13 +25,19 @@ namespace SCHALE.GameServer.Commands
|
|||
InventoryUtils.AddAllWeapons(connection);
|
||||
InventoryUtils.AddAllEquipment(connection);
|
||||
InventoryUtils.AddAllItems(connection);
|
||||
InventoryUtils.AddAllGears(connection);
|
||||
|
||||
connection.SendChatMessage("Added Everything!");
|
||||
break;
|
||||
|
||||
case "clearall":
|
||||
case "removeall":
|
||||
InventoryUtils.RemoveAllCharacters(connection);
|
||||
context.Weapons.RemoveRange(context.Weapons.Where(x => x.AccountServerId == connection.AccountServerId));
|
||||
context.Equipment.RemoveRange(context.Equipment.Where(x => x.AccountServerId == connection.AccountServerId));
|
||||
context.Items.RemoveRange(context.Items.Where(x => x.AccountServerId == connection.AccountServerId));
|
||||
context.Gears.RemoveRange(context.Gears.Where(x => x.AccountServerId == connection.AccountServerId));
|
||||
|
||||
connection.SendChatMessage("Removed Everything!");
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,15 +2,16 @@
|
|||
using SCHALE.GameServer.Services.Irc;
|
||||
using System.ComponentModel;
|
||||
using System.Reflection;
|
||||
using SCHALE.GameServer.Utils;
|
||||
|
||||
namespace SCHALE.GameServer.Commands
|
||||
{
|
||||
[CommandHandler("setaccount", "Command to change player's account data", "/setaccount <|Level|Nickname|RaidSeasonId|Property|...> <Value>")]
|
||||
[CommandHandler("setaccount", "Command to change player's account data (case-sensitive)", "/setaccount <|Level|Nickname|RaidSeasonId|Property|...> <Value>")]
|
||||
internal class SetAccountCommand : Command
|
||||
{
|
||||
public SetAccountCommand(IrcConnection connection, string[] args, bool validate = true) : base(connection, args, validate) { }
|
||||
|
||||
[Argument(0, @"^[a-zA-Z]+$", "The Account Property you want to change.", ArgumentFlags.IgnoreCase)]
|
||||
[Argument(0, @"^[a-zA-Z]+$", "The Account Property you want to change. (case-sensitive)", ArgumentFlags.IgnoreCase)]
|
||||
public string Property { get; set; } = string.Empty;
|
||||
|
||||
[Argument(1, @"", "The value you want to change it to, must match the property type.", ArgumentFlags.IgnoreCase)]
|
||||
|
@ -18,7 +19,7 @@ namespace SCHALE.GameServer.Commands
|
|||
|
||||
public override void Execute()
|
||||
{
|
||||
PropertyInfo? targetProperty = typeof(AccountDB).GetProperty(Property);
|
||||
PropertyInfo? targetProperty = typeof(AccountDB).GetProperty(Property) ?? typeof(AccountDB).GetProperty(Property.Capitalize());
|
||||
|
||||
if (targetProperty != null)
|
||||
{
|
||||
|
@ -31,17 +32,20 @@ namespace SCHALE.GameServer.Commands
|
|||
object targetValue = converter.ConvertFromString(Value);
|
||||
|
||||
targetProperty.SetValue(connection.Account, targetValue);
|
||||
connection.Context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage($"Set Player with UID {connection.AccountServerId}'s {Property} to {Value}");
|
||||
} catch (Exception)
|
||||
{
|
||||
throw new ArgumentException("Invalid Value");
|
||||
}
|
||||
}
|
||||
} else
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
throw new ArgumentException("Invalid Player Property!");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -320,6 +320,11 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
|||
EquipmentDBs = [.. account.Equipment]
|
||||
},
|
||||
|
||||
CharacterGearListResponse = new CharacterGearListResponse()
|
||||
{
|
||||
GearDBs = [.. account.Gears]
|
||||
},
|
||||
|
||||
ClanLoginResponse = new ClanLoginResponse()
|
||||
{
|
||||
AccountClanMemberDB = new()
|
||||
|
@ -328,6 +333,16 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
|||
}
|
||||
},
|
||||
|
||||
EliminateRaidLoginResponse = new EliminateRaidLoginResponse()
|
||||
{
|
||||
SeasonType = RaidSeasonType.Open,
|
||||
SweepPointByRaidUniqueId = new()
|
||||
{
|
||||
{ 2041104, int.MaxValue },
|
||||
{ 2041204, int.MaxValue }
|
||||
}
|
||||
},
|
||||
|
||||
FriendCode = "SCHALE",
|
||||
};
|
||||
}
|
||||
|
@ -445,13 +460,6 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
|||
{
|
||||
return new MiniGameMissionListResponse();
|
||||
}
|
||||
|
||||
// these will probably be commands
|
||||
private void SetRaidSeason(AccountDB account, long seasonId)
|
||||
{
|
||||
account.RaidSeasonId = seasonId;
|
||||
context.SaveChanges();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
using SCHALE.Common.Database;
|
||||
using SCHALE.Common.Database.ModelExtensions;
|
||||
using SCHALE.Common.FlatData;
|
||||
using SCHALE.Common.NetworkProtocol;
|
||||
using SCHALE.GameServer.Services;
|
||||
|
||||
namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
||||
{
|
||||
public class CharacterGear : ProtocolHandlerBase
|
||||
{
|
||||
private readonly ISessionKeyService sessionKeyService;
|
||||
private readonly SCHALEContext context;
|
||||
private readonly ExcelTableService excelTableService;
|
||||
|
||||
public CharacterGear(IProtocolHandlerFactory protocolHandlerFactory, ISessionKeyService _sessionKeyService, SCHALEContext _context, ExcelTableService _excelTableService) : base(protocolHandlerFactory)
|
||||
{
|
||||
sessionKeyService = _sessionKeyService;
|
||||
context = _context;
|
||||
excelTableService = _excelTableService;
|
||||
}
|
||||
|
||||
[ProtocolHandler(Protocol.CharacterGear_Unlock)]
|
||||
public ResponsePacket UnlockHandler(CharacterGearUnlockRequest req)
|
||||
{
|
||||
var account = sessionKeyService.GetAccount(req.SessionKey);
|
||||
|
||||
var gearExcelTable = excelTableService.GetTable<CharacterGearExcelTable>().UnPack().DataList;
|
||||
var targetCharacter = account.Characters.FirstOrDefault(x => x.ServerId == req.CharacterServerId);
|
||||
|
||||
var gearId = gearExcelTable.FirstOrDefault(x => x.CharacterId == targetCharacter.UniqueId).Id;
|
||||
|
||||
var newGear = new GearDB()
|
||||
{
|
||||
UniqueId = gearId,
|
||||
Level = 1,
|
||||
SlotIndex = req.SlotIndex,
|
||||
BoundCharacterServerId = req.CharacterServerId,
|
||||
Tier = 1,
|
||||
Exp = 0,
|
||||
};
|
||||
|
||||
account.AddGears(context, [newGear]);
|
||||
context.SaveChanges();
|
||||
|
||||
return new CharacterGearUnlockResponse()
|
||||
{
|
||||
GearDB = newGear,
|
||||
CharacterDB = targetCharacter,
|
||||
};
|
||||
}
|
||||
|
||||
[ProtocolHandler(Protocol.CharacterGear_TierUp)]
|
||||
public ResponsePacket TierUpHandler(CharacterGearTierUpRequest req)
|
||||
{ // doesnt work
|
||||
var targetGear = context.Gears.FirstOrDefault(x => x.ServerId == req.GearServerId);
|
||||
|
||||
targetGear.Tier++;
|
||||
context.SaveChanges();
|
||||
|
||||
return new CharacterGearTierUpResponse()
|
||||
{
|
||||
GearDB = targetGear,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
using SCHALE.Common.Database;
|
||||
using SCHALE.Common.NetworkProtocol;
|
||||
using SCHALE.GameServer.Services;
|
||||
using SCHALE.GameServer.Utils;
|
||||
|
||||
namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
||||
{
|
||||
|
@ -26,8 +27,8 @@ namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
|||
{
|
||||
IrcConfig = new()
|
||||
{
|
||||
HostAddress = REPLACE WITH YOUR IP,
|
||||
Port = 6667,
|
||||
HostAddress = Config.Instance.Address,
|
||||
Port = Config.Instance.Port,
|
||||
Password = ""
|
||||
},
|
||||
AccountClanDB = new()
|
||||
|
|
|
@ -8,6 +8,8 @@ using SCHALE.GameServer.Services;
|
|||
using Microsoft.EntityFrameworkCore;
|
||||
using SCHALE.GameServer.Services.Irc;
|
||||
using SCHALE.GameServer.Commands;
|
||||
using SCHALE.GameServer.Utils;
|
||||
using System.Net.NetworkInformation;
|
||||
|
||||
namespace SCHALE.GameServer
|
||||
{
|
||||
|
@ -47,6 +49,15 @@ namespace SCHALE.GameServer
|
|||
// Load Commands
|
||||
CommandFactory.LoadCommands();
|
||||
|
||||
// Load Config
|
||||
Config.Load();
|
||||
|
||||
if (Config.Instance.Address == "127.0.0.1")
|
||||
{
|
||||
Config.Instance.Address = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback && i.OperationalStatus == OperationalStatus.Up).First().GetIPProperties().UnicastAddresses.Where(a => a.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().Address.ToString();
|
||||
Config.Save();
|
||||
}
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.Configure<KestrelServerOptions>(op => op.AllowSynchronousIO = true);
|
||||
|
|
|
@ -22,12 +22,12 @@ namespace SCHALE.GameServer.Services.Irc
|
|||
|
||||
public void SendChatMessage(string text)
|
||||
{
|
||||
SendChatMessage(text, "Shiroko", 10010, 0, IrcMessageType.Chat);
|
||||
SendChatMessage(text, "Arona", 19009113, 0, IrcMessageType.Chat);
|
||||
}
|
||||
|
||||
public void SendEmote(long stickerId)
|
||||
{
|
||||
SendChatMessage("", "Shiroko", 10010, stickerId, IrcMessageType.Sticker);
|
||||
SendChatMessage("", "Arona", 19009113, stickerId, IrcMessageType.Sticker);
|
||||
}
|
||||
|
||||
public void SendChatMessage(string text, string nickname, long pfpCharacterId, long stickerId, IrcMessageType messageType)
|
||||
|
|
|
@ -163,6 +163,7 @@ namespace SCHALE.GameServer.Services.Irc
|
|||
{
|
||||
Command? cmd = CommandFactory.CreateCommand(cmdStr, connection, cmdStrings[1..]);
|
||||
|
||||
|
||||
if (cmd is null)
|
||||
{
|
||||
connection.SendChatMessage($"Invalid command {cmdStr}, try /help");
|
||||
|
@ -174,7 +175,10 @@ namespace SCHALE.GameServer.Services.Irc
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var cmdAtr = (CommandHandlerAttribute?)Attribute.GetCustomAttribute(CommandFactory.commands[cmdStr], typeof(CommandHandlerAttribute));
|
||||
|
||||
connection.SendChatMessage($"Command {cmdStr} failed to execute!, " + ex.Message);
|
||||
connection.SendChatMessage($"Usage: {cmdAtr.Usage}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
using Serilog;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace SCHALE.GameServer.Utils
|
||||
{
|
||||
public class Config : Singleton<Config>
|
||||
{
|
||||
public static string ConfigPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config.json");
|
||||
|
||||
public string Address { get; set; } = "127.0.0.1";
|
||||
public int Port { get; set; } = 6667;
|
||||
|
||||
public static void Load()
|
||||
{
|
||||
if (!File.Exists(ConfigPath))
|
||||
Save();
|
||||
|
||||
string json = File.ReadAllText(ConfigPath);
|
||||
|
||||
Instance = JsonSerializer.Deserialize<Config>(json);
|
||||
|
||||
Log.Debug($"Config loaded");
|
||||
}
|
||||
|
||||
public static void Save()
|
||||
{
|
||||
File.WriteAllText(ConfigPath, JsonSerializer.Serialize(Instance));
|
||||
|
||||
Log.Debug($"Config saved");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
using SCHALE.Common.Database;
|
||||
using SCHALE.Common.Database.ModelExtensions;
|
||||
using SCHALE.Common.FlatData;
|
||||
using SCHALE.Common.Migrations;
|
||||
using SCHALE.GameServer.Services;
|
||||
using SCHALE.GameServer.Services.Irc;
|
||||
using System;
|
||||
|
@ -23,6 +24,8 @@ namespace SCHALE.Common.Utils
|
|||
|
||||
account.AddCharacters(context, [.. allCharacters]);
|
||||
context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage("Added all characters!");
|
||||
}
|
||||
|
||||
public static void AddAllEquipment(IrcConnection connection)
|
||||
|
@ -40,6 +43,8 @@ namespace SCHALE.Common.Utils
|
|||
|
||||
connection.Account.AddEquipment(connection.Context, [.. allEquipment]);
|
||||
connection.Context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage("Added all equipment!");
|
||||
}
|
||||
|
||||
public static void AddAllItems(IrcConnection connection)
|
||||
|
@ -57,6 +62,8 @@ namespace SCHALE.Common.Utils
|
|||
|
||||
connection.Account.AddItems(connection.Context, [.. allItems]);
|
||||
connection.Context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage("Added all items!");
|
||||
}
|
||||
|
||||
public static void AddAllWeapons(IrcConnection connection)
|
||||
|
@ -79,8 +86,34 @@ namespace SCHALE.Common.Utils
|
|||
|
||||
account.AddWeapons(context, [.. allWeapons]);
|
||||
context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage("Added all weapons!");
|
||||
}
|
||||
|
||||
public static void AddAllGears(IrcConnection connection)
|
||||
{
|
||||
var account = connection.Account;
|
||||
var context = connection.Context;
|
||||
|
||||
var gearExcel = connection.ExcelTableService.GetTable<CharacterGearExcelTable>().UnPack().DataList;
|
||||
|
||||
var allGears = gearExcel.Where(x => x.Tier == 2 && context.Characters.Any(y => y.UniqueId == x.CharacterId)).Select(x => new GearDB()
|
||||
{
|
||||
UniqueId = x.Id,
|
||||
Level = 1,
|
||||
SlotIndex = 4,
|
||||
BoundCharacterServerId = context.Characters.FirstOrDefault(z => z.UniqueId == x.CharacterId).ServerId,
|
||||
Tier = 2,
|
||||
Exp = 0,
|
||||
});
|
||||
|
||||
account.AddGears(context, [.. allGears]);
|
||||
context.SaveChanges();
|
||||
|
||||
connection.SendChatMessage("Added all gears!");
|
||||
}
|
||||
|
||||
|
||||
public static void RemoveAllCharacters(IrcConnection connection) // removing default characters breaks game
|
||||
{
|
||||
var characterDB = connection.Context.Characters;
|
||||
|
@ -89,6 +122,8 @@ namespace SCHALE.Common.Utils
|
|||
var removed = characterDB.Where(x => x.AccountServerId == connection.AccountServerId && !defaultCharacters.Contains(x.UniqueId));
|
||||
|
||||
characterDB.RemoveRange(removed);
|
||||
|
||||
connection.SendChatMessage("Removed all characters!");
|
||||
}
|
||||
|
||||
public static CharacterDB CreateMaxCharacterFromId(long characterId)
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
namespace SCHALE.GameServer.Utils
|
||||
{
|
||||
public abstract class Singleton<T> where T : new()
|
||||
{
|
||||
static T instance;
|
||||
public static T Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
instance = new T();
|
||||
|
||||
return instance;
|
||||
}
|
||||
set => instance = value;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace SCHALE.GameServer.Utils
|
||||
{
|
||||
public static class StringExtension
|
||||
{
|
||||
public static string Capitalize(this string str)
|
||||
{
|
||||
return char.ToUpperInvariant(str[0]) + str.Substring(1);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue