Clothing and pronoun fields (#2689)

* Clothing & Gender fields: Add to database [MODIFIED TO NOT DEPEND ON SAPHIRE-DB-REFACTOR]

Sorry about this, Saphire.

* Clothing & Gender fields: Add UI [FALLBACK II]

* Clothing & Gender fields: Actually apply gender

* Clothing & Gender fields: Import innerclothingskirt field from my previous attempt

Couldn't import actual prototypes because of a change to IDs

* Clothing & Gender fields: Add innerclothingskirt field to everything

* Clothing & Gender fields: Jumpskirts now work

* Clothing & Gender fields: Gender field will follow sex field if it's not different (UX improvement) [FALLBACK II]

* Clothing & Gender fields: Gender -> Pronouns to reduce confusion. Also, fix profile summary. Properly. [FALLBACK II]

* Clothing & Pronoun fields: Refactor so that profile equipment adjustments are performed in StartingGearPrototype.
This commit is contained in:
20kdc
2020-12-24 13:42:40 +00:00
committed by GitHub
parent b4506b4d08
commit 6b5cded8c2
40 changed files with 1866 additions and 337 deletions

View File

@@ -17,6 +17,8 @@ namespace Content.Client.UserInterface
{ {
Profile = HumanoidCharacterProfile.Random(); Profile = HumanoidCharacterProfile.Random();
UpdateSexControls(); UpdateSexControls();
UpdateGenderControls();
UpdateClothingControls();
UpdateAgeEdit(); UpdateAgeEdit();
UpdateNameEdit(); UpdateNameEdit();
UpdateHairPickers(); UpdateHairPickers();

View File

@@ -17,6 +17,7 @@ using Robust.Shared.Map;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Utility; using Robust.Shared.Utility;
using Robust.Shared.Localization.Macros;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -40,7 +41,8 @@ namespace Content.Client.UserInterface
private readonly Button _saveButton; private readonly Button _saveButton;
private readonly Button _sexFemaleButton; private readonly Button _sexFemaleButton;
private readonly Button _sexMaleButton; private readonly Button _sexMaleButton;
private readonly Button _sexClassifiedButton; private readonly OptionButton _genderButton;
private readonly OptionButton _clothingButton;
private readonly HairStylePicker _hairPicker; private readonly HairStylePicker _hairPicker;
private readonly FacialHairStylePicker _facialHairPicker; private readonly FacialHairStylePicker _facialHairPicker;
@@ -165,27 +167,34 @@ namespace Content.Client.UserInterface
Text = Loc.GetString("Male"), Text = Loc.GetString("Male"),
Group = sexButtonGroup Group = sexButtonGroup
}; };
_sexMaleButton.OnPressed += args => { SetSex(Sex.Male); }; _sexMaleButton.OnPressed += args =>
{
SetSex(Sex.Male);
if (Profile.Gender == Gender.Female)
{
SetGender(Gender.Male);
UpdateGenderControls();
}
};
_sexFemaleButton = new Button _sexFemaleButton = new Button
{ {
Text = Loc.GetString("Female"), Text = Loc.GetString("Female"),
Group = sexButtonGroup Group = sexButtonGroup
}; };
_sexFemaleButton.OnPressed += args => { SetSex(Sex.Female); }; _sexFemaleButton.OnPressed += args =>
_sexClassifiedButton = new Button
{ {
/* DUR WHAT IF I PUT ATTACK HELICOPTER HERE DUR HUR AHUHRUHWUIDHAEILUBFOWEL(*&RFH#W*(OBFD&*/ SetSex(Sex.Female);
Text = Loc.GetString("Classified"), if (Profile.Gender == Gender.Male)
Group = sexButtonGroup {
SetGender(Gender.Female);
UpdateGenderControls();
}
}; };
_sexClassifiedButton.OnPressed += args => { SetSex(Sex.Classified); };
hBox.AddChild(sexLabel); hBox.AddChild(sexLabel);
hBox.AddChild(_sexMaleButton); hBox.AddChild(_sexMaleButton);
hBox.AddChild(_sexFemaleButton); hBox.AddChild(_sexFemaleButton);
hBox.AddChild(_sexClassifiedButton);
panel.AddChild(hBox); panel.AddChild(hBox);
sexAndAgeRow.AddChild(panel); sexAndAgeRow.AddChild(panel);
} }
@@ -213,6 +222,34 @@ namespace Content.Client.UserInterface
#endregion Age #endregion Age
#region Gender
{
var panel = HighlightedContainer();
var hBox = new HBoxContainer();
var genderLabel = new Label { Text = Loc.GetString("Pronouns:") };
_genderButton = new OptionButton();
_genderButton.AddItem(Loc.GetString("He / Him"), (int) Gender.Male);
_genderButton.AddItem(Loc.GetString("She / Her"), (int) Gender.Female);
_genderButton.AddItem(Loc.GetString("They / Them"), (int) Gender.Epicene);
_genderButton.AddItem(Loc.GetString("It / It"), (int) Gender.Neuter);
_genderButton.OnItemSelected += args =>
{
_genderButton.SelectId(args.Id);
SetGender((Gender) args.Id);
};
hBox.AddChild(genderLabel);
hBox.AddChild(_genderButton);
panel.AddChild(hBox);
sexAndAgeRow.AddChild(panel);
}
#endregion Gender
#region Hair #region Hair
{ {
@@ -270,6 +307,32 @@ namespace Content.Client.UserInterface
} }
#endregion Hair #endregion Hair
#region Clothing
{
var panel = HighlightedContainer();
var hBox = new HBoxContainer();
var clothingLabel = new Label { Text = Loc.GetString("Clothing:") };
_clothingButton = new OptionButton();
_clothingButton.AddItem(Loc.GetString("Jumpsuit"), (int) ClothingPreference.Jumpsuit);
_clothingButton.AddItem(Loc.GetString("Jumpskirt"), (int) ClothingPreference.Jumpskirt);
_clothingButton.OnItemSelected += args =>
{
_clothingButton.SelectId(args.Id);
SetClothing((ClothingPreference) args.Id);
};
hBox.AddChild(clothingLabel);
hBox.AddChild(_clothingButton);
panel.AddChild(hBox);
appearanceVBox.AddChild(panel);
}
#endregion Clothing
} }
#endregion #endregion
@@ -588,12 +651,24 @@ namespace Content.Client.UserInterface
IsDirty = true; IsDirty = true;
} }
private void SetGender(Gender newGender)
{
Profile = Profile?.WithGender(newGender);
IsDirty = true;
}
private void SetName(string newName) private void SetName(string newName)
{ {
Profile = Profile?.WithName(newName); Profile = Profile?.WithName(newName);
IsDirty = true; IsDirty = true;
} }
private void SetClothing(ClothingPreference newClothing)
{
Profile = Profile?.WithClothingPreference(newClothing);
IsDirty = true;
}
public void Save() public void Save()
{ {
IsDirty = false; IsDirty = false;
@@ -638,6 +713,16 @@ namespace Content.Client.UserInterface
_sexFemaleButton.Pressed = true; _sexFemaleButton.Pressed = true;
} }
private void UpdateGenderControls()
{
_genderButton.SelectId((int) Profile.Gender);
}
private void UpdateClothingControls()
{
_clothingButton.SelectId((int) Profile.Clothing);
}
private void UpdateHairPickers() private void UpdateHairPickers()
{ {
_hairPicker.SetData( _hairPicker.SetData(
@@ -667,6 +752,8 @@ namespace Content.Client.UserInterface
if (Profile is null) return; if (Profile is null) return;
UpdateNameEdit(); UpdateNameEdit();
UpdateSexControls(); UpdateSexControls();
UpdateGenderControls();
UpdateClothingControls();
UpdateAgeEdit(); UpdateAgeEdit();
UpdateHairPickers(); UpdateHairPickers();
UpdateSaveButton(); UpdateSaveButton();

View File

@@ -6,6 +6,7 @@ using Content.Shared;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Preferences; using Content.Shared.Preferences;
using Content.Shared.Roles; using Content.Shared.Roles;
using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines;
using Robust.Client.Interfaces.GameObjects.Components; using Robust.Client.Interfaces.GameObjects.Components;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
@@ -140,13 +141,15 @@ namespace Content.Client.UserInterface
inventory.ClearAllSlotVisuals(); inventory.ClearAllSlotVisuals();
foreach (var (slot, itemType) in gear.Equipment) foreach (var slot in AllSlots)
{ {
var item = entityMan.SpawnEntity(itemType, MapCoordinates.Nullspace); var itemType = gear.GetGear(slot, profile);
if (itemType != "")
inventory.SetSlotVisuals(slot, item); {
var item = entityMan.SpawnEntity(itemType, MapCoordinates.Nullspace);
item.Delete(); inventory.SetSlotVisuals(slot, item);
item.Delete();
}
} }
} }
} }

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Content.Server.GameTicking; using Content.Server.GameTicking;
using Content.Server.Interfaces.GameTicking; using Content.Server.Interfaces.GameTicking;
using Content.Shared.Roles; using Content.Shared.Roles;
using Content.Shared.Preferences;
using Content.Server.Mobs; using Content.Server.Mobs;
using Robust.Server.Interfaces.Player; using Robust.Server.Interfaces.Player;
using Robust.Server.Interfaces.Console; using Robust.Server.Interfaces.Console;
@@ -76,7 +77,7 @@ namespace Content.IntegrationTests
public EntityCoordinates GetJobSpawnPoint(string jobId) => EntityCoordinates.Invalid; public EntityCoordinates GetJobSpawnPoint(string jobId) => EntityCoordinates.Invalid;
public EntityCoordinates GetObserverSpawnPoint() => EntityCoordinates.Invalid; public EntityCoordinates GetObserverSpawnPoint() => EntityCoordinates.Invalid;
public void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear) public void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear, HumanoidCharacterProfile profile)
{ {
} }

View File

@@ -0,0 +1,570 @@
// <auto-generated />
using System;
using System.Net;
using Content.Server.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Content.Server.Database.Migrations.Postgres
{
[DbContext(typeof(PostgresServerDbContext))]
[Migration("20201203093409_ClothingAndPronouns")]
partial class ClothingAndPronouns
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.UseIdentityByDefaultColumns()
.HasAnnotation("Relational:MaxIdentifierLength", 63)
.HasAnnotation("ProductVersion", "5.0.0");
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Property<Guid>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property<int?>("AdminRankId")
.HasColumnType("integer")
.HasColumnName("admin_rank_id");
b.Property<string>("Title")
.HasColumnType("text")
.HasColumnName("title");
b.HasKey("UserId");
b.HasIndex("AdminRankId");
b.ToTable("admin");
});
modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("admin_flag_id")
.UseIdentityByDefaultColumn();
b.Property<Guid>("AdminId")
.HasColumnType("uuid")
.HasColumnName("admin_id");
b.Property<string>("Flag")
.IsRequired()
.HasColumnType("text")
.HasColumnName("flag");
b.Property<bool>("Negative")
.HasColumnType("boolean")
.HasColumnName("negative");
b.HasKey("Id");
b.HasIndex("AdminId");
b.HasIndex("Flag", "AdminId")
.IsUnique();
b.ToTable("admin_flag");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("admin_rank_id")
.UseIdentityByDefaultColumn();
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");
b.HasKey("Id");
b.ToTable("admin_rank");
});
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("admin_rank_flag_id")
.UseIdentityByDefaultColumn();
b.Property<int>("AdminRankId")
.HasColumnType("integer")
.HasColumnName("admin_rank_id");
b.Property<string>("Flag")
.IsRequired()
.HasColumnType("text")
.HasColumnName("flag");
b.HasKey("Id");
b.HasIndex("AdminRankId");
b.HasIndex("Flag", "AdminRankId")
.IsUnique();
b.ToTable("admin_rank_flag");
});
modelBuilder.Entity("Content.Server.Database.Antag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("antag_id")
.UseIdentityByDefaultColumn();
b.Property<string>("AntagName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("antag_name");
b.Property<int>("ProfileId")
.HasColumnType("integer")
.HasColumnName("profile_id");
b.HasKey("Id");
b.HasIndex("ProfileId", "AntagName")
.IsUnique();
b.ToTable("antag");
});
modelBuilder.Entity("Content.Server.Database.AssignedUserId", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("assigned_user_id_id")
.UseIdentityByDefaultColumn();
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property<string>("UserName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("user_name");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.HasIndex("UserName")
.IsUnique();
b.ToTable("assigned_user_id");
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("job_id")
.UseIdentityByDefaultColumn();
b.Property<string>("JobName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("job_name");
b.Property<int>("Priority")
.HasColumnType("integer")
.HasColumnName("priority");
b.Property<int>("ProfileId")
.HasColumnType("integer")
.HasColumnName("profile_id");
b.HasKey("Id");
b.HasIndex("ProfileId");
b.ToTable("job");
});
modelBuilder.Entity("Content.Server.Database.PostgresConnectionLog", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("connection_log_id")
.UseIdentityByDefaultColumn();
b.Property<IPAddress>("Address")
.IsRequired()
.HasColumnType("inet")
.HasColumnName("address");
b.Property<DateTime>("Time")
.HasColumnType("timestamp with time zone")
.HasColumnName("time");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property<string>("UserName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("user_name");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("connection_log");
b.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address");
});
modelBuilder.Entity("Content.Server.Database.PostgresPlayer", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("player_id")
.UseIdentityByDefaultColumn();
b.Property<DateTime>("FirstSeenTime")
.HasColumnType("timestamp with time zone")
.HasColumnName("first_seen_time");
b.Property<IPAddress>("LastSeenAddress")
.IsRequired()
.HasColumnType("inet")
.HasColumnName("last_seen_address");
b.Property<DateTime>("LastSeenTime")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_seen_time");
b.Property<string>("LastSeenUserName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("last_seen_user_name");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("LastSeenUserName");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("player");
b.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address");
});
modelBuilder.Entity("Content.Server.Database.PostgresServerBan", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("server_ban_id")
.UseIdentityByDefaultColumn();
b.Property<ValueTuple<IPAddress, int>?>("Address")
.HasColumnType("inet")
.HasColumnName("address");
b.Property<DateTime>("BanTime")
.HasColumnType("timestamp with time zone")
.HasColumnName("ban_time");
b.Property<Guid?>("BanningAdmin")
.HasColumnType("uuid")
.HasColumnName("banning_admin");
b.Property<DateTime?>("ExpirationTime")
.HasColumnType("timestamp with time zone")
.HasColumnName("expiration_time");
b.Property<string>("Reason")
.IsRequired()
.HasColumnType("text")
.HasColumnName("reason");
b.Property<Guid?>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("Address");
b.HasIndex("UserId");
b.ToTable("server_ban");
b.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address");
b.HasCheckConstraint("HaveEitherAddressOrUserId", "address IS NOT NULL OR user_id IS NOT NULL");
});
modelBuilder.Entity("Content.Server.Database.PostgresServerUnban", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("unban_id")
.UseIdentityByDefaultColumn();
b.Property<int>("BanId")
.HasColumnType("integer")
.HasColumnName("ban_id");
b.Property<DateTime>("UnbanTime")
.HasColumnType("timestamp with time zone")
.HasColumnName("unban_time");
b.Property<Guid?>("UnbanningAdmin")
.HasColumnType("uuid")
.HasColumnName("unbanning_admin");
b.HasKey("Id");
b.HasIndex("BanId")
.IsUnique();
b.ToTable("server_unban");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("preference_id")
.UseIdentityByDefaultColumn();
b.Property<int>("SelectedCharacterSlot")
.HasColumnType("integer")
.HasColumnName("selected_character_slot");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("preference");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("profile_id")
.UseIdentityByDefaultColumn();
b.Property<int>("Age")
.HasColumnType("integer")
.HasColumnName("age");
b.Property<string>("CharacterName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("char_name");
b.Property<string>("Clothing")
.IsRequired()
.HasColumnType("text")
.HasColumnName("clothing");
b.Property<string>("EyeColor")
.IsRequired()
.HasColumnType("text")
.HasColumnName("eye_color");
b.Property<string>("FacialHairColor")
.IsRequired()
.HasColumnType("text")
.HasColumnName("facial_hair_color");
b.Property<string>("FacialHairName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("facial_hair_name");
b.Property<string>("Gender")
.IsRequired()
.HasColumnType("text")
.HasColumnName("gender");
b.Property<string>("HairColor")
.IsRequired()
.HasColumnType("text")
.HasColumnName("hair_color");
b.Property<string>("HairName")
.IsRequired()
.HasColumnType("text")
.HasColumnName("hair_name");
b.Property<int>("PreferenceId")
.HasColumnType("integer")
.HasColumnName("preference_id");
b.Property<int>("PreferenceUnavailable")
.HasColumnType("integer")
.HasColumnName("pref_unavailable");
b.Property<string>("Sex")
.IsRequired()
.HasColumnType("text")
.HasColumnName("sex");
b.Property<string>("SkinColor")
.IsRequired()
.HasColumnType("text")
.HasColumnName("skin_color");
b.Property<int>("Slot")
.HasColumnType("integer")
.HasColumnName("slot");
b.HasKey("Id");
b.HasIndex("PreferenceId");
b.HasIndex("Slot", "PreferenceId")
.IsUnique();
b.ToTable("profile");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.HasOne("Content.Server.Database.AdminRank", "AdminRank")
.WithMany("Admins")
.HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.SetNull);
b.Navigation("AdminRank");
});
modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
{
b.HasOne("Content.Server.Database.Admin", "Admin")
.WithMany("Flags")
.HasForeignKey("AdminId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Admin");
});
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
{
b.HasOne("Content.Server.Database.AdminRank", "Rank")
.WithMany("Flags")
.HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Rank");
});
modelBuilder.Entity("Content.Server.Database.Antag", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("Antags")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("Jobs")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.PostgresServerUnban", b =>
{
b.HasOne("Content.Server.Database.PostgresServerBan", "Ban")
.WithOne("Unban")
.HasForeignKey("Content.Server.Database.PostgresServerUnban", "BanId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Ban");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.HasOne("Content.Server.Database.Preference", "Preference")
.WithMany("Profiles")
.HasForeignKey("PreferenceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Preference");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Navigation("Admins");
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.PostgresServerBan", b =>
{
b.Navigation("Unban");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Navigation("Profiles");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Navigation("Antags");
b.Navigation("Jobs");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,35 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Content.Server.Database.Migrations.Postgres
{
public partial class ClothingAndPronouns : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "clothing",
table: "profile",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "gender",
table: "profile",
type: "text",
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "clothing",
table: "profile");
migrationBuilder.DropColumn(
name: "gender",
table: "profile");
}
}
}

View File

@@ -16,24 +16,24 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) .UseIdentityByDefaultColumns()
.HasAnnotation("ProductVersion", "3.1.4") .HasAnnotation("Relational:MaxIdentifierLength", 63)
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("ProductVersion", "5.0.0");
modelBuilder.Entity("Content.Server.Database.Admin", b => modelBuilder.Entity("Content.Server.Database.Admin", b =>
{ {
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.Property<int?>("AdminRankId") b.Property<int?>("AdminRankId")
.HasColumnName("admin_rank_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("admin_rank_id");
b.Property<string>("Title") b.Property<string>("Title")
.HasColumnName("title") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("title");
b.HasKey("UserId"); b.HasKey("UserId");
@@ -46,22 +46,22 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_flag_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("admin_flag_id")
.UseIdentityByDefaultColumn();
b.Property<Guid>("AdminId") b.Property<Guid>("AdminId")
.HasColumnName("admin_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("admin_id");
b.Property<string>("Flag") b.Property<string>("Flag")
.IsRequired() .IsRequired()
.HasColumnName("flag") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("flag");
b.Property<bool>("Negative") b.Property<bool>("Negative")
.HasColumnName("negative") .HasColumnType("boolean")
.HasColumnType("boolean"); .HasColumnName("negative");
b.HasKey("Id"); b.HasKey("Id");
@@ -77,14 +77,14 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_rank_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("admin_rank_id")
.UseIdentityByDefaultColumn();
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasColumnName("name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("name");
b.HasKey("Id"); b.HasKey("Id");
@@ -95,18 +95,18 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_rank_flag_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("admin_rank_flag_id")
.UseIdentityByDefaultColumn();
b.Property<int>("AdminRankId") b.Property<int>("AdminRankId")
.HasColumnName("admin_rank_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("admin_rank_id");
b.Property<string>("Flag") b.Property<string>("Flag")
.IsRequired() .IsRequired()
.HasColumnName("flag") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("flag");
b.HasKey("Id"); b.HasKey("Id");
@@ -122,18 +122,18 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("antag_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("antag_id")
.UseIdentityByDefaultColumn();
b.Property<string>("AntagName") b.Property<string>("AntagName")
.IsRequired() .IsRequired()
.HasColumnName("antag_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("antag_name");
b.Property<int>("ProfileId") b.Property<int>("ProfileId")
.HasColumnName("profile_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("profile_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -147,18 +147,18 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("assigned_user_id_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("assigned_user_id_id")
.UseIdentityByDefaultColumn();
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.Property<string>("UserName") b.Property<string>("UserName")
.IsRequired() .IsRequired()
.HasColumnName("user_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("user_name");
b.HasKey("Id"); b.HasKey("Id");
@@ -175,22 +175,22 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("job_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("job_id")
.UseIdentityByDefaultColumn();
b.Property<string>("JobName") b.Property<string>("JobName")
.IsRequired() .IsRequired()
.HasColumnName("job_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("job_name");
b.Property<int>("Priority") b.Property<int>("Priority")
.HasColumnName("priority") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("priority");
b.Property<int>("ProfileId") b.Property<int>("ProfileId")
.HasColumnName("profile_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("profile_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -203,27 +203,27 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("connection_log_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("connection_log_id")
.UseIdentityByDefaultColumn();
b.Property<IPAddress>("Address") b.Property<IPAddress>("Address")
.IsRequired() .IsRequired()
.HasColumnName("address") .HasColumnType("inet")
.HasColumnType("inet"); .HasColumnName("address");
b.Property<DateTime>("Time") b.Property<DateTime>("Time")
.HasColumnName("time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("time");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.Property<string>("UserName") b.Property<string>("UserName")
.IsRequired() .IsRequired()
.HasColumnName("user_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("user_name");
b.HasKey("Id"); b.HasKey("Id");
@@ -238,31 +238,31 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("player_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("player_id")
.UseIdentityByDefaultColumn();
b.Property<DateTime>("FirstSeenTime") b.Property<DateTime>("FirstSeenTime")
.HasColumnName("first_seen_time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("first_seen_time");
b.Property<IPAddress>("LastSeenAddress") b.Property<IPAddress>("LastSeenAddress")
.IsRequired() .IsRequired()
.HasColumnName("last_seen_address") .HasColumnType("inet")
.HasColumnType("inet"); .HasColumnName("last_seen_address");
b.Property<DateTime>("LastSeenTime") b.Property<DateTime>("LastSeenTime")
.HasColumnName("last_seen_time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("last_seen_time");
b.Property<string>("LastSeenUserName") b.Property<string>("LastSeenUserName")
.IsRequired() .IsRequired()
.HasColumnName("last_seen_user_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("last_seen_user_name");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -280,34 +280,34 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("server_ban_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("server_ban_id")
.UseIdentityByDefaultColumn();
b.Property<ValueTuple<IPAddress, int>?>("Address") b.Property<ValueTuple<IPAddress, int>?>("Address")
.HasColumnName("address") .HasColumnType("inet")
.HasColumnType("inet"); .HasColumnName("address");
b.Property<DateTime>("BanTime") b.Property<DateTime>("BanTime")
.HasColumnName("ban_time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("ban_time");
b.Property<Guid?>("BanningAdmin") b.Property<Guid?>("BanningAdmin")
.HasColumnName("banning_admin") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("banning_admin");
b.Property<DateTime?>("ExpirationTime") b.Property<DateTime?>("ExpirationTime")
.HasColumnName("expiration_time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("expiration_time");
b.Property<string>("Reason") b.Property<string>("Reason")
.IsRequired() .IsRequired()
.HasColumnName("reason") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("reason");
b.Property<Guid?>("UserId") b.Property<Guid?>("UserId")
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -326,21 +326,21 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("unban_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("unban_id")
.UseIdentityByDefaultColumn();
b.Property<int>("BanId") b.Property<int>("BanId")
.HasColumnName("ban_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("ban_id");
b.Property<DateTime>("UnbanTime") b.Property<DateTime>("UnbanTime")
.HasColumnName("unban_time") .HasColumnType("timestamp with time zone")
.HasColumnType("timestamp with time zone"); .HasColumnName("unban_time");
b.Property<Guid?>("UnbanningAdmin") b.Property<Guid?>("UnbanningAdmin")
.HasColumnName("unbanning_admin") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("unbanning_admin");
b.HasKey("Id"); b.HasKey("Id");
@@ -354,17 +354,17 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("preference_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("preference_id")
.UseIdentityByDefaultColumn();
b.Property<int>("SelectedCharacterSlot") b.Property<int>("SelectedCharacterSlot")
.HasColumnName("selected_character_slot") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("selected_character_slot");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("uuid")
.HasColumnType("uuid"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -378,65 +378,75 @@ namespace Content.Server.Database.Migrations.Postgres
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("profile_id")
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasColumnName("profile_id")
.UseIdentityByDefaultColumn();
b.Property<int>("Age") b.Property<int>("Age")
.HasColumnName("age") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("age");
b.Property<string>("CharacterName") b.Property<string>("CharacterName")
.IsRequired() .IsRequired()
.HasColumnName("char_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("char_name");
b.Property<string>("Clothing")
.IsRequired()
.HasColumnType("text")
.HasColumnName("clothing");
b.Property<string>("EyeColor") b.Property<string>("EyeColor")
.IsRequired() .IsRequired()
.HasColumnName("eye_color") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("eye_color");
b.Property<string>("FacialHairColor") b.Property<string>("FacialHairColor")
.IsRequired() .IsRequired()
.HasColumnName("facial_hair_color") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("facial_hair_color");
b.Property<string>("FacialHairName") b.Property<string>("FacialHairName")
.IsRequired() .IsRequired()
.HasColumnName("facial_hair_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("facial_hair_name");
b.Property<string>("Gender")
.IsRequired()
.HasColumnType("text")
.HasColumnName("gender");
b.Property<string>("HairColor") b.Property<string>("HairColor")
.IsRequired() .IsRequired()
.HasColumnName("hair_color") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("hair_color");
b.Property<string>("HairName") b.Property<string>("HairName")
.IsRequired() .IsRequired()
.HasColumnName("hair_name") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("hair_name");
b.Property<int>("PreferenceId") b.Property<int>("PreferenceId")
.HasColumnName("preference_id") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("preference_id");
b.Property<int>("PreferenceUnavailable") b.Property<int>("PreferenceUnavailable")
.HasColumnName("pref_unavailable") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("pref_unavailable");
b.Property<string>("Sex") b.Property<string>("Sex")
.IsRequired() .IsRequired()
.HasColumnName("sex") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("sex");
b.Property<string>("SkinColor") b.Property<string>("SkinColor")
.IsRequired() .IsRequired()
.HasColumnName("skin_color") .HasColumnType("text")
.HasColumnType("text"); .HasColumnName("skin_color");
b.Property<int>("Slot") b.Property<int>("Slot")
.HasColumnName("slot") .HasColumnType("integer")
.HasColumnType("integer"); .HasColumnName("slot");
b.HasKey("Id"); b.HasKey("Id");
@@ -454,6 +464,8 @@ namespace Content.Server.Database.Migrations.Postgres
.WithMany("Admins") .WithMany("Admins")
.HasForeignKey("AdminRankId") .HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.SetNull); .OnDelete(DeleteBehavior.SetNull);
b.Navigation("AdminRank");
}); });
modelBuilder.Entity("Content.Server.Database.AdminFlag", b => modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
@@ -463,6 +475,8 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("AdminId") .HasForeignKey("AdminId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Admin");
}); });
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
@@ -472,6 +486,8 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("AdminRankId") .HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Rank");
}); });
modelBuilder.Entity("Content.Server.Database.Antag", b => modelBuilder.Entity("Content.Server.Database.Antag", b =>
@@ -481,6 +497,8 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("ProfileId") .HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Profile");
}); });
modelBuilder.Entity("Content.Server.Database.Job", b => modelBuilder.Entity("Content.Server.Database.Job", b =>
@@ -490,6 +508,8 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("ProfileId") .HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Profile");
}); });
modelBuilder.Entity("Content.Server.Database.PostgresServerUnban", b => modelBuilder.Entity("Content.Server.Database.PostgresServerUnban", b =>
@@ -499,6 +519,8 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("Content.Server.Database.PostgresServerUnban", "BanId") .HasForeignKey("Content.Server.Database.PostgresServerUnban", "BanId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Ban");
}); });
modelBuilder.Entity("Content.Server.Database.Profile", b => modelBuilder.Entity("Content.Server.Database.Profile", b =>
@@ -508,6 +530,37 @@ namespace Content.Server.Database.Migrations.Postgres
.HasForeignKey("PreferenceId") .HasForeignKey("PreferenceId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Preference");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Navigation("Admins");
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.PostgresServerBan", b =>
{
b.Navigation("Unban");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Navigation("Profiles");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Navigation("Antags");
b.Navigation("Jobs");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@@ -0,0 +1,537 @@
// <auto-generated />
using System;
using Content.Server.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Content.Server.Database.Migrations.Sqlite
{
[DbContext(typeof(SqliteServerDbContext))]
[Migration("20201203093351_ClothingAndPronouns")]
partial class ClothingAndPronouns
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.0");
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Property<Guid>("UserId")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<int?>("AdminRankId")
.HasColumnType("INTEGER")
.HasColumnName("admin_rank_id");
b.Property<string>("Title")
.HasColumnType("TEXT")
.HasColumnName("title");
b.HasKey("UserId");
b.HasIndex("AdminRankId");
b.ToTable("admin");
});
modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("admin_flag_id");
b.Property<Guid>("AdminId")
.HasColumnType("TEXT")
.HasColumnName("admin_id");
b.Property<string>("Flag")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("flag");
b.Property<bool>("Negative")
.HasColumnType("INTEGER")
.HasColumnName("negative");
b.HasKey("Id");
b.HasIndex("AdminId");
b.HasIndex("Flag", "AdminId")
.IsUnique();
b.ToTable("admin_flag");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("admin_rank_id");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("name");
b.HasKey("Id");
b.ToTable("admin_rank");
});
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("admin_rank_flag_id");
b.Property<int>("AdminRankId")
.HasColumnType("INTEGER")
.HasColumnName("admin_rank_id");
b.Property<string>("Flag")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("flag");
b.HasKey("Id");
b.HasIndex("AdminRankId");
b.HasIndex("Flag", "AdminRankId")
.IsUnique();
b.ToTable("admin_rank_flag");
});
modelBuilder.Entity("Content.Server.Database.Antag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("antag_id");
b.Property<string>("AntagName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("antag_name");
b.Property<int>("ProfileId")
.HasColumnType("INTEGER")
.HasColumnName("profile_id");
b.HasKey("Id");
b.HasIndex("ProfileId", "AntagName")
.IsUnique();
b.ToTable("antag");
});
modelBuilder.Entity("Content.Server.Database.AssignedUserId", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("assigned_user_id_id");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<string>("UserName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("user_name");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.HasIndex("UserName")
.IsUnique();
b.ToTable("assigned_user_id");
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("job_id");
b.Property<string>("JobName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("job_name");
b.Property<int>("Priority")
.HasColumnType("INTEGER")
.HasColumnName("priority");
b.Property<int>("ProfileId")
.HasColumnType("INTEGER")
.HasColumnName("profile_id");
b.HasKey("Id");
b.HasIndex("ProfileId");
b.ToTable("job");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("preference_id");
b.Property<int>("SelectedCharacterSlot")
.HasColumnType("INTEGER")
.HasColumnName("selected_character_slot");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("preference");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("profile_id");
b.Property<int>("Age")
.HasColumnType("INTEGER")
.HasColumnName("age");
b.Property<string>("CharacterName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("char_name");
b.Property<string>("Clothing")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("clothing");
b.Property<string>("EyeColor")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("eye_color");
b.Property<string>("FacialHairColor")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("facial_hair_color");
b.Property<string>("FacialHairName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("facial_hair_name");
b.Property<string>("Gender")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("gender");
b.Property<string>("HairColor")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("hair_color");
b.Property<string>("HairName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("hair_name");
b.Property<int>("PreferenceId")
.HasColumnType("INTEGER")
.HasColumnName("preference_id");
b.Property<int>("PreferenceUnavailable")
.HasColumnType("INTEGER")
.HasColumnName("pref_unavailable");
b.Property<string>("Sex")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("sex");
b.Property<string>("SkinColor")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("skin_color");
b.Property<int>("Slot")
.HasColumnType("INTEGER")
.HasColumnName("slot");
b.HasKey("Id");
b.HasIndex("PreferenceId");
b.HasIndex("Slot", "PreferenceId")
.IsUnique();
b.ToTable("profile");
});
modelBuilder.Entity("Content.Server.Database.SqliteConnectionLog", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("connection_log_id");
b.Property<string>("Address")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("address");
b.Property<DateTime>("Time")
.HasColumnType("TEXT")
.HasColumnName("time");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<string>("UserName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("user_name");
b.HasKey("Id");
b.ToTable("connection_log");
});
modelBuilder.Entity("Content.Server.Database.SqlitePlayer", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("player_id");
b.Property<DateTime>("FirstSeenTime")
.HasColumnType("TEXT")
.HasColumnName("first_seen_time");
b.Property<string>("LastSeenAddress")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("last_seen_address");
b.Property<DateTime>("LastSeenTime")
.HasColumnType("TEXT")
.HasColumnName("last_seen_time");
b.Property<string>("LastSeenUserName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("last_seen_user_name");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("LastSeenUserName");
b.ToTable("player");
});
modelBuilder.Entity("Content.Server.Database.SqliteServerBan", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("ban_id");
b.Property<string>("Address")
.HasColumnType("TEXT")
.HasColumnName("address");
b.Property<DateTime>("BanTime")
.HasColumnType("TEXT")
.HasColumnName("ban_time");
b.Property<Guid?>("BanningAdmin")
.HasColumnType("TEXT")
.HasColumnName("banning_admin");
b.Property<DateTime?>("ExpirationTime")
.HasColumnType("TEXT")
.HasColumnName("expiration_time");
b.Property<string>("Reason")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("reason");
b.Property<Guid?>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.ToTable("ban");
});
modelBuilder.Entity("Content.Server.Database.SqliteServerUnban", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("unban_id");
b.Property<int>("BanId")
.HasColumnType("INTEGER")
.HasColumnName("ban_id");
b.Property<DateTime>("UnbanTime")
.HasColumnType("TEXT")
.HasColumnName("unban_time");
b.Property<Guid?>("UnbanningAdmin")
.HasColumnType("TEXT")
.HasColumnName("unbanning_admin");
b.HasKey("Id");
b.HasIndex("BanId")
.IsUnique();
b.ToTable("unban");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.HasOne("Content.Server.Database.AdminRank", "AdminRank")
.WithMany("Admins")
.HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.SetNull);
b.Navigation("AdminRank");
});
modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
{
b.HasOne("Content.Server.Database.Admin", "Admin")
.WithMany("Flags")
.HasForeignKey("AdminId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Admin");
});
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
{
b.HasOne("Content.Server.Database.AdminRank", "Rank")
.WithMany("Flags")
.HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Rank");
});
modelBuilder.Entity("Content.Server.Database.Antag", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("Antags")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.Job", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("Jobs")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.HasOne("Content.Server.Database.Preference", "Preference")
.WithMany("Profiles")
.HasForeignKey("PreferenceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Preference");
});
modelBuilder.Entity("Content.Server.Database.SqliteServerUnban", b =>
{
b.HasOne("Content.Server.Database.SqliteServerBan", "Ban")
.WithOne("Unban")
.HasForeignKey("Content.Server.Database.SqliteServerUnban", "BanId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Ban");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Navigation("Admins");
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Navigation("Profiles");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Navigation("Antags");
b.Navigation("Jobs");
});
modelBuilder.Entity("Content.Server.Database.SqliteServerBan", b =>
{
b.Navigation("Unban");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,35 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Content.Server.Database.Migrations.Sqlite
{
public partial class ClothingAndPronouns : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "clothing",
table: "profile",
type: "TEXT",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<string>(
name: "gender",
table: "profile",
type: "TEXT",
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "clothing",
table: "profile");
migrationBuilder.DropColumn(
name: "gender",
table: "profile");
}
}
}

View File

@@ -14,22 +14,22 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "3.1.4"); .HasAnnotation("ProductVersion", "5.0.0");
modelBuilder.Entity("Content.Server.Database.Admin", b => modelBuilder.Entity("Content.Server.Database.Admin", b =>
{ {
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.Property<int?>("AdminRankId") b.Property<int?>("AdminRankId")
.HasColumnName("admin_rank_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("admin_rank_id");
b.Property<string>("Title") b.Property<string>("Title")
.HasColumnName("title") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("title");
b.HasKey("UserId"); b.HasKey("UserId");
@@ -42,21 +42,21 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_flag_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("admin_flag_id");
b.Property<Guid>("AdminId") b.Property<Guid>("AdminId")
.HasColumnName("admin_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("admin_id");
b.Property<string>("Flag") b.Property<string>("Flag")
.IsRequired() .IsRequired()
.HasColumnName("flag") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("flag");
b.Property<bool>("Negative") b.Property<bool>("Negative")
.HasColumnName("negative") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("negative");
b.HasKey("Id"); b.HasKey("Id");
@@ -72,13 +72,13 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_rank_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("admin_rank_id");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasColumnName("name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("name");
b.HasKey("Id"); b.HasKey("Id");
@@ -89,17 +89,17 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("admin_rank_flag_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("admin_rank_flag_id");
b.Property<int>("AdminRankId") b.Property<int>("AdminRankId")
.HasColumnName("admin_rank_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("admin_rank_id");
b.Property<string>("Flag") b.Property<string>("Flag")
.IsRequired() .IsRequired()
.HasColumnName("flag") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("flag");
b.HasKey("Id"); b.HasKey("Id");
@@ -115,17 +115,17 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("antag_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("antag_id");
b.Property<string>("AntagName") b.Property<string>("AntagName")
.IsRequired() .IsRequired()
.HasColumnName("antag_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("antag_name");
b.Property<int>("ProfileId") b.Property<int>("ProfileId")
.HasColumnName("profile_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("profile_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -139,17 +139,17 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("assigned_user_id_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("assigned_user_id_id");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.Property<string>("UserName") b.Property<string>("UserName")
.IsRequired() .IsRequired()
.HasColumnName("user_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_name");
b.HasKey("Id"); b.HasKey("Id");
@@ -166,21 +166,21 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("job_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("job_id");
b.Property<string>("JobName") b.Property<string>("JobName")
.IsRequired() .IsRequired()
.HasColumnName("job_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("job_name");
b.Property<int>("Priority") b.Property<int>("Priority")
.HasColumnName("priority") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("priority");
b.Property<int>("ProfileId") b.Property<int>("ProfileId")
.HasColumnName("profile_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("profile_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -193,16 +193,16 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("preference_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("preference_id");
b.Property<int>("SelectedCharacterSlot") b.Property<int>("SelectedCharacterSlot")
.HasColumnName("selected_character_slot") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("selected_character_slot");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -216,64 +216,74 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("profile_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("profile_id");
b.Property<int>("Age") b.Property<int>("Age")
.HasColumnName("age") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("age");
b.Property<string>("CharacterName") b.Property<string>("CharacterName")
.IsRequired() .IsRequired()
.HasColumnName("char_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("char_name");
b.Property<string>("Clothing")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("clothing");
b.Property<string>("EyeColor") b.Property<string>("EyeColor")
.IsRequired() .IsRequired()
.HasColumnName("eye_color") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("eye_color");
b.Property<string>("FacialHairColor") b.Property<string>("FacialHairColor")
.IsRequired() .IsRequired()
.HasColumnName("facial_hair_color") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("facial_hair_color");
b.Property<string>("FacialHairName") b.Property<string>("FacialHairName")
.IsRequired() .IsRequired()
.HasColumnName("facial_hair_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("facial_hair_name");
b.Property<string>("Gender")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("gender");
b.Property<string>("HairColor") b.Property<string>("HairColor")
.IsRequired() .IsRequired()
.HasColumnName("hair_color") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("hair_color");
b.Property<string>("HairName") b.Property<string>("HairName")
.IsRequired() .IsRequired()
.HasColumnName("hair_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("hair_name");
b.Property<int>("PreferenceId") b.Property<int>("PreferenceId")
.HasColumnName("preference_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("preference_id");
b.Property<int>("PreferenceUnavailable") b.Property<int>("PreferenceUnavailable")
.HasColumnName("pref_unavailable") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("pref_unavailable");
b.Property<string>("Sex") b.Property<string>("Sex")
.IsRequired() .IsRequired()
.HasColumnName("sex") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("sex");
b.Property<string>("SkinColor") b.Property<string>("SkinColor")
.IsRequired() .IsRequired()
.HasColumnName("skin_color") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("skin_color");
b.Property<int>("Slot") b.Property<int>("Slot")
.HasColumnName("slot") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("slot");
b.HasKey("Id"); b.HasKey("Id");
@@ -289,26 +299,26 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("connection_log_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("connection_log_id");
b.Property<string>("Address") b.Property<string>("Address")
.IsRequired() .IsRequired()
.HasColumnName("address") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("address");
b.Property<DateTime>("Time") b.Property<DateTime>("Time")
.HasColumnName("time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("time");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.Property<string>("UserName") b.Property<string>("UserName")
.IsRequired() .IsRequired()
.HasColumnName("user_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_name");
b.HasKey("Id"); b.HasKey("Id");
@@ -319,30 +329,30 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("player_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("player_id");
b.Property<DateTime>("FirstSeenTime") b.Property<DateTime>("FirstSeenTime")
.HasColumnName("first_seen_time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("first_seen_time");
b.Property<string>("LastSeenAddress") b.Property<string>("LastSeenAddress")
.IsRequired() .IsRequired()
.HasColumnName("last_seen_address") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("last_seen_address");
b.Property<DateTime>("LastSeenTime") b.Property<DateTime>("LastSeenTime")
.HasColumnName("last_seen_time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("last_seen_time");
b.Property<string>("LastSeenUserName") b.Property<string>("LastSeenUserName")
.IsRequired() .IsRequired()
.HasColumnName("last_seen_user_name") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("last_seen_user_name");
b.Property<Guid>("UserId") b.Property<Guid>("UserId")
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -355,33 +365,33 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("ban_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("ban_id");
b.Property<string>("Address") b.Property<string>("Address")
.HasColumnName("address") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("address");
b.Property<DateTime>("BanTime") b.Property<DateTime>("BanTime")
.HasColumnName("ban_time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("ban_time");
b.Property<Guid?>("BanningAdmin") b.Property<Guid?>("BanningAdmin")
.HasColumnName("banning_admin") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("banning_admin");
b.Property<DateTime?>("ExpirationTime") b.Property<DateTime?>("ExpirationTime")
.HasColumnName("expiration_time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("expiration_time");
b.Property<string>("Reason") b.Property<string>("Reason")
.IsRequired() .IsRequired()
.HasColumnName("reason") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("reason");
b.Property<Guid?>("UserId") b.Property<Guid?>("UserId")
.HasColumnName("user_id") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("user_id");
b.HasKey("Id"); b.HasKey("Id");
@@ -392,20 +402,20 @@ namespace Content.Server.Database.Migrations.Sqlite
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnName("unban_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("unban_id");
b.Property<int>("BanId") b.Property<int>("BanId")
.HasColumnName("ban_id") .HasColumnType("INTEGER")
.HasColumnType("INTEGER"); .HasColumnName("ban_id");
b.Property<DateTime>("UnbanTime") b.Property<DateTime>("UnbanTime")
.HasColumnName("unban_time") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("unban_time");
b.Property<Guid?>("UnbanningAdmin") b.Property<Guid?>("UnbanningAdmin")
.HasColumnName("unbanning_admin") .HasColumnType("TEXT")
.HasColumnType("TEXT"); .HasColumnName("unbanning_admin");
b.HasKey("Id"); b.HasKey("Id");
@@ -421,6 +431,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.WithMany("Admins") .WithMany("Admins")
.HasForeignKey("AdminRankId") .HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.SetNull); .OnDelete(DeleteBehavior.SetNull);
b.Navigation("AdminRank");
}); });
modelBuilder.Entity("Content.Server.Database.AdminFlag", b => modelBuilder.Entity("Content.Server.Database.AdminFlag", b =>
@@ -430,6 +442,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("AdminId") .HasForeignKey("AdminId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Admin");
}); });
modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b =>
@@ -439,6 +453,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("AdminRankId") .HasForeignKey("AdminRankId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Rank");
}); });
modelBuilder.Entity("Content.Server.Database.Antag", b => modelBuilder.Entity("Content.Server.Database.Antag", b =>
@@ -448,6 +464,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("ProfileId") .HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Profile");
}); });
modelBuilder.Entity("Content.Server.Database.Job", b => modelBuilder.Entity("Content.Server.Database.Job", b =>
@@ -457,6 +475,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("ProfileId") .HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Profile");
}); });
modelBuilder.Entity("Content.Server.Database.Profile", b => modelBuilder.Entity("Content.Server.Database.Profile", b =>
@@ -466,6 +486,8 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("PreferenceId") .HasForeignKey("PreferenceId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Preference");
}); });
modelBuilder.Entity("Content.Server.Database.SqliteServerUnban", b => modelBuilder.Entity("Content.Server.Database.SqliteServerUnban", b =>
@@ -475,6 +497,37 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasForeignKey("Content.Server.Database.SqliteServerUnban", "BanId") .HasForeignKey("Content.Server.Database.SqliteServerUnban", "BanId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("Ban");
});
modelBuilder.Entity("Content.Server.Database.Admin", b =>
{
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.AdminRank", b =>
{
b.Navigation("Admins");
b.Navigation("Flags");
});
modelBuilder.Entity("Content.Server.Database.Preference", b =>
{
b.Navigation("Profiles");
});
modelBuilder.Entity("Content.Server.Database.Profile", b =>
{
b.Navigation("Antags");
b.Navigation("Jobs");
});
modelBuilder.Entity("Content.Server.Database.SqliteServerBan", b =>
{
b.Navigation("Unban");
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@@ -91,12 +91,14 @@ namespace Content.Server.Database
[Column("char_name")] public string CharacterName { get; set; } = null!; [Column("char_name")] public string CharacterName { get; set; } = null!;
[Column("age")] public int Age { get; set; } [Column("age")] public int Age { get; set; }
[Column("sex")] public string Sex { get; set; } = null!; [Column("sex")] public string Sex { get; set; } = null!;
[Column("gender")] public string Gender { get; set; } = null!;
[Column("hair_name")] public string HairName { get; set; } = null!; [Column("hair_name")] public string HairName { get; set; } = null!;
[Column("hair_color")] public string HairColor { get; set; } = null!; [Column("hair_color")] public string HairColor { get; set; } = null!;
[Column("facial_hair_name")] public string FacialHairName { get; set; } = null!; [Column("facial_hair_name")] public string FacialHairName { get; set; } = null!;
[Column("facial_hair_color")] public string FacialHairColor { get; set; } = null!; [Column("facial_hair_color")] public string FacialHairColor { get; set; } = null!;
[Column("eye_color")] public string EyeColor { get; set; } = null!; [Column("eye_color")] public string EyeColor { get; set; } = null!;
[Column("skin_color")] public string SkinColor { get; set; } = null!; [Column("skin_color")] public string SkinColor { get; set; } = null!;
[Column("clothing")] public string Clothing { get; set; } = null!;
public List<Job> Jobs { get; } = new(); public List<Job> Jobs { get; } = new();
public List<Antag> Antags { get; } = new(); public List<Antag> Antags { get; } = new();

View File

@@ -9,6 +9,7 @@ using Content.Shared.Preferences;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Localization.Macros;
namespace Content.Server.Database namespace Content.Server.Database
{ {
@@ -130,10 +131,24 @@ namespace Content.Server.Database
{ {
var jobs = profile.Jobs.ToDictionary(j => j.JobName, j => (JobPriority) j.Priority); var jobs = profile.Jobs.ToDictionary(j => j.JobName, j => (JobPriority) j.Priority);
var antags = profile.Antags.Select(a => a.AntagName); var antags = profile.Antags.Select(a => a.AntagName);
var sex = Sex.Male;
if (Enum.TryParse<Sex>(profile.Sex, true, out var sexVal))
sex = sexVal;
var clothing = ClothingPreference.Jumpsuit;
if (Enum.TryParse<ClothingPreference>(profile.Clothing, true, out var clothingVal))
clothing = clothingVal;
var gender = sex == Sex.Male ? Gender.Male : Gender.Female;
if (Enum.TryParse<Gender>(profile.Gender, true, out var genderVal))
gender = genderVal;
return new HumanoidCharacterProfile( return new HumanoidCharacterProfile(
profile.CharacterName, profile.CharacterName,
profile.Age, profile.Age,
profile.Sex == "Male" ? Sex.Male : Sex.Female, sex,
gender,
new HumanoidCharacterAppearance new HumanoidCharacterAppearance
( (
profile.HairName, profile.HairName,
@@ -143,6 +158,7 @@ namespace Content.Server.Database
Color.FromHex(profile.EyeColor), Color.FromHex(profile.EyeColor),
Color.FromHex(profile.SkinColor) Color.FromHex(profile.SkinColor)
), ),
clothing,
jobs, jobs,
(PreferenceUnavailableMode) profile.PreferenceUnavailable, (PreferenceUnavailableMode) profile.PreferenceUnavailable,
antags.ToList() antags.ToList()
@@ -158,12 +174,14 @@ namespace Content.Server.Database
CharacterName = humanoid.Name, CharacterName = humanoid.Name,
Age = humanoid.Age, Age = humanoid.Age,
Sex = humanoid.Sex.ToString(), Sex = humanoid.Sex.ToString(),
Gender = humanoid.Gender.ToString(),
HairName = appearance.HairStyleName, HairName = appearance.HairStyleName,
HairColor = appearance.HairColor.ToHex(), HairColor = appearance.HairColor.ToHex(),
FacialHairName = appearance.FacialHairStyleName, FacialHairName = appearance.FacialHairStyleName,
FacialHairColor = appearance.FacialHairColor.ToHex(), FacialHairColor = appearance.FacialHairColor.ToHex(),
EyeColor = appearance.EyeColor.ToHex(), EyeColor = appearance.EyeColor.ToHex(),
SkinColor = appearance.SkinColor.ToHex(), SkinColor = appearance.SkinColor.ToHex(),
Clothing = humanoid.Clothing.ToString(),
Slot = slot, Slot = slot,
PreferenceUnavailable = (DbPreferenceUnavailableMode) humanoid.PreferenceUnavailable PreferenceUnavailable = (DbPreferenceUnavailableMode) humanoid.PreferenceUnavailable
}; };

View File

@@ -4,6 +4,8 @@ using Content.Server.GameObjects.EntitySystems.AI;
using Content.Server.Interfaces.GameTicking; using Content.Server.Interfaces.GameTicking;
using Content.Shared.GameObjects.Components.Movement; using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.Roles; using Content.Shared.Roles;
using Content.Shared.Preferences;
using Robust.Server.AI;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Components; using Robust.Shared.GameObjects.Components;
using Robust.Shared.GameObjects.Systems; using Robust.Shared.GameObjects.Systems;
@@ -68,7 +70,7 @@ namespace Content.Server.GameObjects.Components.Movement
if (StartingGearPrototype != null) if (StartingGearPrototype != null)
{ {
var startingGear = _prototypeManager.Index<StartingGearPrototype>(StartingGearPrototype); var startingGear = _prototypeManager.Index<StartingGearPrototype>(StartingGearPrototype);
_gameTicker.EquipStartingGear(Owner, startingGear); _gameTicker.EquipStartingGear(Owner, startingGear, null);
} }
} }

View File

@@ -577,26 +577,34 @@ namespace Content.Server.GameTicking
return Paused; return Paused;
} }
private IEntity _spawnPlayerMob(Job job, bool lateJoin = true) private IEntity _spawnPlayerMob(Job job, HumanoidCharacterProfile profile, bool lateJoin = true)
{ {
EntityCoordinates coordinates = lateJoin ? GetLateJoinSpawnPoint() : GetJobSpawnPoint(job.Prototype.ID); EntityCoordinates coordinates = lateJoin ? GetLateJoinSpawnPoint() : GetJobSpawnPoint(job.Prototype.ID);
var entity = _entityManager.SpawnEntity(PlayerPrototypeName, coordinates); var entity = _entityManager.SpawnEntity(PlayerPrototypeName, coordinates);
var startingGear = _prototypeManager.Index<StartingGearPrototype>(job.StartingGear); var startingGear = _prototypeManager.Index<StartingGearPrototype>(job.StartingGear);
EquipStartingGear(entity, startingGear); EquipStartingGear(entity, startingGear, profile);
if (profile != null)
{
entity.GetComponent<HumanoidAppearanceComponent>().UpdateFromProfile(profile);
entity.Name = profile.Name;
}
return entity; return entity;
} }
public void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear) public void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear, HumanoidCharacterProfile profile)
{ {
if (entity.TryGetComponent(out InventoryComponent inventory)) if (entity.TryGetComponent(out InventoryComponent inventory))
{ {
var gear = startingGear.Equipment; foreach (var slot in AllSlots)
foreach (var (slot, equipmentStr) in gear)
{ {
var equipmentEntity = _entityManager.SpawnEntity(equipmentStr, entity.Transform.Coordinates); var equipmentStr = startingGear.GetGear(slot, profile);
inventory.Equip(slot, equipmentEntity.GetComponent<ItemComponent>()); if (equipmentStr != "")
{
var equipmentEntity = _entityManager.SpawnEntity(equipmentStr, entity.Transform.Coordinates);
inventory.Equip(slot, equipmentEntity.GetComponent<ItemComponent>());
}
} }
} }
@@ -611,14 +619,6 @@ namespace Content.Server.GameTicking
} }
} }
private void ApplyCharacterProfile(IEntity entity, ICharacterProfile profile)
{
if (profile is null)
return;
entity.GetComponent<HumanoidAppearanceComponent>().UpdateFromProfile(profile);
entity.Name = profile.Name;
}
private IEntity _spawnObserverMob() private IEntity _spawnObserverMob()
{ {
var coordinates = GetObserverSpawnPoint(); var coordinates = GetObserverSpawnPoint();
@@ -888,9 +888,8 @@ namespace Content.Server.GameTicking
var job = new Job(data.Mind, jobPrototype); var job = new Job(data.Mind, jobPrototype);
data.Mind.AddRole(job); data.Mind.AddRole(job);
var mob = _spawnPlayerMob(job, lateJoin); var mob = _spawnPlayerMob(job, character, lateJoin);
data.Mind.TransferTo(mob); data.Mind.TransferTo(mob);
ApplyCharacterProfile(mob, character);
if (session.UserId == new Guid("{e887eb93-f503-4b65-95b6-2f282c014192}")) if (session.UserId == new Guid("{e887eb93-f503-4b65-95b6-2f282c014192}"))
{ {

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Content.Server.GameTicking; using Content.Server.GameTicking;
using Content.Server.Mobs; using Content.Server.Mobs;
using Content.Shared.Roles; using Content.Shared.Roles;
using Content.Shared.Preferences;
using Robust.Server.Interfaces.Player; using Robust.Server.Interfaces.Player;
using Robust.Server.Interfaces.Console; using Robust.Server.Interfaces.Console;
using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects;
@@ -51,7 +52,7 @@ namespace Content.Server.Interfaces.GameTicking
EntityCoordinates GetJobSpawnPoint(string jobId); EntityCoordinates GetJobSpawnPoint(string jobId);
EntityCoordinates GetObserverSpawnPoint(); EntityCoordinates GetObserverSpawnPoint();
void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear); void EquipStartingGear(IEntity entity, StartingGearPrototype startingGear, HumanoidCharacterProfile profile);
// GameRule system. // GameRule system.
T AddGameRule<T>() where T : GameRule, new(); T AddGameRule<T>() where T : GameRule, new();

View File

@@ -11,6 +11,7 @@ namespace Content.Shared.GameObjects.Components.Mobs
{ {
private HumanoidCharacterAppearance _appearance; private HumanoidCharacterAppearance _appearance;
private Sex _sex; private Sex _sex;
private Gender _gender;
public sealed override string Name => "HumanoidAppearance"; public sealed override string Name => "HumanoidAppearance";
public sealed override uint? NetID => ContentNetIDs.HUMANOID_APPEARANCE; public sealed override uint? NetID => ContentNetIDs.HUMANOID_APPEARANCE;
@@ -37,17 +38,20 @@ namespace Content.Shared.GameObjects.Components.Mobs
} }
} }
public Gender Gender => Sex switch [ViewVariables(VVAccess.ReadWrite)]
public virtual Gender Gender
{ {
Sex.Female => Gender.Female, get => _gender;
Sex.Male => Gender.Male, set
Sex.Classified => Gender.Neuter, {
_ => Gender.Epicene, _gender = value;
}; Dirty();
}
}
public override ComponentState GetComponentState() public override ComponentState GetComponentState()
{ {
return new HumanoidAppearanceComponentState(Appearance, Sex); return new HumanoidAppearanceComponentState(Appearance, Sex, Gender);
} }
public override void HandleComponentState(ComponentState curState, ComponentState nextState) public override void HandleComponentState(ComponentState curState, ComponentState nextState)
@@ -59,6 +63,7 @@ namespace Content.Shared.GameObjects.Components.Mobs
Appearance = cast.Appearance; Appearance = cast.Appearance;
Sex = cast.Sex; Sex = cast.Sex;
Gender = cast.Gender;
} }
public void UpdateFromProfile(ICharacterProfile profile) public void UpdateFromProfile(ICharacterProfile profile)
@@ -66,20 +71,23 @@ namespace Content.Shared.GameObjects.Components.Mobs
var humanoid = (HumanoidCharacterProfile) profile; var humanoid = (HumanoidCharacterProfile) profile;
Appearance = (HumanoidCharacterAppearance) humanoid.CharacterAppearance; Appearance = (HumanoidCharacterAppearance) humanoid.CharacterAppearance;
Sex = humanoid.Sex; Sex = humanoid.Sex;
Gender = humanoid.Gender;
} }
[Serializable] [Serializable]
[NetSerializable] [NetSerializable]
private sealed class HumanoidAppearanceComponentState : ComponentState private sealed class HumanoidAppearanceComponentState : ComponentState
{ {
public HumanoidAppearanceComponentState(HumanoidCharacterAppearance appearance, Sex sex) : base(ContentNetIDs.HUMANOID_APPEARANCE) public HumanoidAppearanceComponentState(HumanoidCharacterAppearance appearance, Sex sex, Gender gender) : base(ContentNetIDs.HUMANOID_APPEARANCE)
{ {
Appearance = appearance; Appearance = appearance;
Sex = sex; Sex = sex;
Gender = gender;
} }
public HumanoidCharacterAppearance Appearance { get; } public HumanoidCharacterAppearance Appearance { get; }
public Sex Sex { get; } public Sex Sex { get; }
public Gender Gender { get; }
} }
} }
} }

View File

@@ -0,0 +1,11 @@
namespace Content.Shared.Preferences
{
/// <summary>
/// The clothing preference for a profile. Stored in database!
/// </summary>
public enum ClothingPreference
{
Jumpsuit,
Jumpskirt
}
}

View File

@@ -10,11 +10,16 @@ using Robust.Shared.IoC;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.Localization.Macros;
using Robust.Shared.Localization;
namespace Content.Shared.Preferences namespace Content.Shared.Preferences
{ {
/// <summary>
/// Character profile. Looks immutable, but uses non-immutable semantics internally for serialization/code sanity purposes.
/// </summary>
[Serializable, NetSerializable] [Serializable, NetSerializable]
public class HumanoidCharacterProfile : ICharacterProfile public class HumanoidCharacterProfile : ICharacterProfile, IGenderable
{ {
private readonly Dictionary<string, JobPriority> _jobPriorities; private readonly Dictionary<string, JobPriority> _jobPriorities;
private readonly List<string> _antagPreferences; private readonly List<string> _antagPreferences;
@@ -26,7 +31,9 @@ namespace Content.Shared.Preferences
string name, string name,
int age, int age,
Sex sex, Sex sex,
Gender gender,
HumanoidCharacterAppearance appearance, HumanoidCharacterAppearance appearance,
ClothingPreference clothing,
Dictionary<string, JobPriority> jobPriorities, Dictionary<string, JobPriority> jobPriorities,
PreferenceUnavailableMode preferenceUnavailable, PreferenceUnavailableMode preferenceUnavailable,
List<string> antagPreferences) List<string> antagPreferences)
@@ -34,21 +41,41 @@ namespace Content.Shared.Preferences
Name = name; Name = name;
Age = age; Age = age;
Sex = sex; Sex = sex;
Gender = gender;
Appearance = appearance; Appearance = appearance;
Clothing = clothing;
_jobPriorities = jobPriorities; _jobPriorities = jobPriorities;
PreferenceUnavailable = preferenceUnavailable; PreferenceUnavailable = preferenceUnavailable;
_antagPreferences = antagPreferences; _antagPreferences = antagPreferences;
} }
/// <summary>Copy constructor but with overridable references (to prevent useless copies)</summary>
private HumanoidCharacterProfile(
HumanoidCharacterProfile other,
Dictionary<string, JobPriority> jobPriorities,
List<string> antagPreferences)
: this(other.Name, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing,
jobPriorities, other.PreferenceUnavailable, antagPreferences)
{
}
/// <summary>Copy constructor</summary>
private HumanoidCharacterProfile(HumanoidCharacterProfile other)
: this(other, new Dictionary<string, JobPriority>(other.JobPriorities), new List<string>(other.AntagPreferences))
{
}
public HumanoidCharacterProfile( public HumanoidCharacterProfile(
string name, string name,
int age, int age,
Sex sex, Sex sex,
Gender gender,
HumanoidCharacterAppearance appearance, HumanoidCharacterAppearance appearance,
ClothingPreference clothing,
IReadOnlyDictionary<string, JobPriority> jobPriorities, IReadOnlyDictionary<string, JobPriority> jobPriorities,
PreferenceUnavailableMode preferenceUnavailable, PreferenceUnavailableMode preferenceUnavailable,
IReadOnlyList<string> antagPreferences) IReadOnlyList<string> antagPreferences)
: this(name, age, sex, appearance, new Dictionary<string, JobPriority>(jobPriorities), : this(name, age, sex, gender, appearance, clothing, new Dictionary<string, JobPriority>(jobPriorities),
preferenceUnavailable, new List<string>(antagPreferences)) preferenceUnavailable, new List<string>(antagPreferences))
{ {
} }
@@ -62,6 +89,7 @@ namespace Content.Shared.Preferences
{ {
var random = IoCManager.Resolve<IRobustRandom>(); var random = IoCManager.Resolve<IRobustRandom>();
var sex = random.Prob(0.5f) ? Sex.Male : Sex.Female; var sex = random.Prob(0.5f) ? Sex.Male : Sex.Female;
var gender = sex == Sex.Male ? Gender.Male : Gender.Female;
var firstName = random.Pick(sex == Sex.Male var firstName = random.Pick(sex == Sex.Male
? Names.MaleFirstNames ? Names.MaleFirstNames
@@ -70,52 +98,57 @@ namespace Content.Shared.Preferences
var name = $"{firstName} {lastName}"; var name = $"{firstName} {lastName}";
var age = random.Next(MinimumAge, MaximumAge); var age = random.Next(MinimumAge, MaximumAge);
return new HumanoidCharacterProfile(name, age, sex, HumanoidCharacterAppearance.Random(sex), return new HumanoidCharacterProfile(name, age, sex, gender, HumanoidCharacterAppearance.Random(sex), ClothingPreference.Jumpsuit,
new Dictionary<string, JobPriority> new Dictionary<string, JobPriority>
{ {
{SharedGameTicker.OverflowJob, JobPriority.High} {SharedGameTicker.OverflowJob, JobPriority.High}
}, PreferenceUnavailableMode.StayInLobby, new List<string>()); }, PreferenceUnavailableMode.StayInLobby, new List<string>());
} }
public string Name { get; } public string Name { get; private set; }
public int Age { get; } public int Age { get; private set; }
public Sex Sex { get; } public Sex Sex { get; private set; }
public Gender Gender { get; private set; }
public ICharacterAppearance CharacterAppearance => Appearance; public ICharacterAppearance CharacterAppearance => Appearance;
public HumanoidCharacterAppearance Appearance { get; } public HumanoidCharacterAppearance Appearance { get; private set; }
public ClothingPreference Clothing { get; private set; }
public IReadOnlyDictionary<string, JobPriority> JobPriorities => _jobPriorities; public IReadOnlyDictionary<string, JobPriority> JobPriorities => _jobPriorities;
public IReadOnlyList<string> AntagPreferences => _antagPreferences; public IReadOnlyList<string> AntagPreferences => _antagPreferences;
public PreferenceUnavailableMode PreferenceUnavailable { get; } public PreferenceUnavailableMode PreferenceUnavailable { get; private set; }
public HumanoidCharacterProfile WithName(string name) public HumanoidCharacterProfile WithName(string name)
{ {
return new(name, Age, Sex, Appearance, _jobPriorities, PreferenceUnavailable, _antagPreferences); return new(this) { Name = name };
} }
public HumanoidCharacterProfile WithAge(int age) public HumanoidCharacterProfile WithAge(int age)
{ {
return new(Name, Math.Clamp(age, MinimumAge, MaximumAge), Sex, Appearance, _jobPriorities, PreferenceUnavailable, _antagPreferences); return new(this) { Age = age };
} }
public HumanoidCharacterProfile WithSex(Sex sex) public HumanoidCharacterProfile WithSex(Sex sex)
{ {
return new(Name, Age, sex, Appearance, _jobPriorities, PreferenceUnavailable, _antagPreferences); return new(this) { Sex = sex };
}
public HumanoidCharacterProfile WithGender(Gender gender)
{
return new(this) { Gender = gender };
} }
public HumanoidCharacterProfile WithCharacterAppearance(HumanoidCharacterAppearance appearance) public HumanoidCharacterProfile WithCharacterAppearance(HumanoidCharacterAppearance appearance)
{ {
return new(Name, Age, Sex, appearance, _jobPriorities, PreferenceUnavailable, _antagPreferences); return new(this) { Appearance = appearance };
}
public HumanoidCharacterProfile WithClothingPreference(ClothingPreference clothing)
{
return new(this) { Clothing = clothing };
} }
public HumanoidCharacterProfile WithJobPriorities(IEnumerable<KeyValuePair<string, JobPriority>> jobPriorities) public HumanoidCharacterProfile WithJobPriorities(IEnumerable<KeyValuePair<string, JobPriority>> jobPriorities)
{ {
return new( return new(this, new Dictionary<string, JobPriority>(jobPriorities), _antagPreferences);
Name,
Age,
Sex,
Appearance,
new Dictionary<string, JobPriority>(jobPriorities),
PreferenceUnavailable,
_antagPreferences);
} }
public HumanoidCharacterProfile WithJobPriority(string jobId, JobPriority priority) public HumanoidCharacterProfile WithJobPriority(string jobId, JobPriority priority)
@@ -129,25 +162,17 @@ namespace Content.Shared.Preferences
{ {
dictionary[jobId] = priority; dictionary[jobId] = priority;
} }
return new(this, dictionary, _antagPreferences);
return new HumanoidCharacterProfile(Name, Age, Sex, Appearance, dictionary, PreferenceUnavailable, _antagPreferences);
} }
public HumanoidCharacterProfile WithPreferenceUnavailable(PreferenceUnavailableMode mode) public HumanoidCharacterProfile WithPreferenceUnavailable(PreferenceUnavailableMode mode)
{ {
return new(Name, Age, Sex, Appearance, _jobPriorities, mode, _antagPreferences); return new(this) { PreferenceUnavailable = mode };
} }
public HumanoidCharacterProfile WithAntagPreferences(IEnumerable<string> antagPreferences) public HumanoidCharacterProfile WithAntagPreferences(IEnumerable<string> antagPreferences)
{ {
return new( return new(this, _jobPriorities, new List<string>(antagPreferences));
Name,
Age,
Sex,
Appearance,
_jobPriorities,
PreferenceUnavailable,
new List<string>(antagPreferences));
} }
public HumanoidCharacterProfile WithAntagPreference(string antagId, bool pref) public HumanoidCharacterProfile WithAntagPreference(string antagId, bool pref)
@@ -167,7 +192,7 @@ namespace Content.Shared.Preferences
list.Remove(antagId); list.Remove(antagId);
} }
} }
return new HumanoidCharacterProfile(Name, Age, Sex, Appearance, _jobPriorities, PreferenceUnavailable, list); return new(this, _jobPriorities, list);
} }
/// <summary> /// <summary>
@@ -184,6 +209,14 @@ namespace Content.Shared.Preferences
Sex.Female => Sex.Female, Sex.Female => Sex.Female,
_ => Sex.Male // Invalid enum values. _ => Sex.Male // Invalid enum values.
}; };
var gender = profile.Gender switch
{
Gender.Epicene => Gender.Epicene,
Gender.Female => Gender.Female,
Gender.Male => Gender.Male,
Gender.Neuter => Gender.Neuter,
_ => Gender.Epicene // Invalid enum values.
};
string name; string name;
if (string.IsNullOrEmpty(profile.Name)) if (string.IsNullOrEmpty(profile.Name))
@@ -214,6 +247,13 @@ namespace Content.Shared.Preferences
_ => PreferenceUnavailableMode.StayInLobby // Invalid enum values. _ => PreferenceUnavailableMode.StayInLobby // Invalid enum values.
}; };
var clothing = profile.Clothing switch
{
ClothingPreference.Jumpsuit => ClothingPreference.Jumpsuit,
ClothingPreference.Jumpskirt => ClothingPreference.Jumpskirt,
_ => ClothingPreference.Jumpsuit // Invalid enum values.
};
var priorities = new Dictionary<string, JobPriority>(profile.JobPriorities var priorities = new Dictionary<string, JobPriority>(profile.JobPriorities
.Where(p => prototypeManager.HasIndex<JobPrototype>(p.Key) && p.Value switch .Where(p => prototypeManager.HasIndex<JobPrototype>(p.Key) && p.Value switch
{ {
@@ -228,11 +268,11 @@ namespace Content.Shared.Preferences
.Where(prototypeManager.HasIndex<AntagPrototype>) .Where(prototypeManager.HasIndex<AntagPrototype>)
.ToList(); .ToList();
return new HumanoidCharacterProfile(name, age, sex, appearance, priorities, prefsUnavailableMode, antags); return new HumanoidCharacterProfile(name, age, sex, gender, appearance, clothing, priorities, prefsUnavailableMode, antags);
} }
public string Summary => public string Summary =>
$"{Name}, {Age} years old human. Their gender is {Sex.ToString().ToLower()}."; Loc.GetString("{0}, {1} years old human. {2:Their} pronouns are {2:they}/{2:them}.", Name, Age, this);
public bool MemberwiseEquals(ICharacterProfile maybeOther) public bool MemberwiseEquals(ICharacterProfile maybeOther)
{ {
@@ -240,7 +280,9 @@ namespace Content.Shared.Preferences
if (Name != other.Name) return false; if (Name != other.Name) return false;
if (Age != other.Age) return false; if (Age != other.Age) return false;
if (Sex != other.Sex) return false; if (Sex != other.Sex) return false;
if (Gender != other.Gender) return false;
if (PreferenceUnavailable != other.PreferenceUnavailable) return false; if (PreferenceUnavailable != other.PreferenceUnavailable) return false;
if (Clothing != other.Clothing) return false;
if (!_jobPriorities.SequenceEqual(other._jobPriorities)) return false; if (!_jobPriorities.SequenceEqual(other._jobPriorities)) return false;
if (!_antagPreferences.SequenceEqual(other._antagPreferences)) return false; if (!_antagPreferences.SequenceEqual(other._antagPreferences)) return false;
return Appearance.MemberwiseEquals(other.Appearance); return Appearance.MemberwiseEquals(other.Appearance);
@@ -254,13 +296,18 @@ namespace Content.Shared.Preferences
public override int GetHashCode() public override int GetHashCode()
{ {
return HashCode.Combine( return HashCode.Combine(
Name, HashCode.Combine(
Age, Name,
Sex, Age,
Sex,
Gender,
Appearance,
Clothing
),
PreferenceUnavailable, PreferenceUnavailable,
_jobPriorities, _jobPriorities,
_antagPreferences, _antagPreferences
Appearance); );
} }
} }
} }

View File

@@ -3,7 +3,6 @@
public enum Sex public enum Sex
{ {
Male, Male,
Female, Female
Classified
} }
} }

View File

@@ -1,3 +1,4 @@
#nullable enable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -5,6 +6,7 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
using YamlDotNet.RepresentationModel; using YamlDotNet.RepresentationModel;
using Content.Shared.Preferences;
using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines; using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines;
namespace Content.Shared.Roles namespace Content.Shared.Roles
@@ -12,19 +14,22 @@ namespace Content.Shared.Roles
[Prototype("startingGear")] [Prototype("startingGear")]
public class StartingGearPrototype : IPrototype, IIndexedPrototype public class StartingGearPrototype : IPrototype, IIndexedPrototype
{ {
private string _id; private string _id = default!;
private Dictionary<Slots, string> _equipment; private Dictionary<Slots, string> _equipment = default!;
/// <summary>
/// if empty, there is no skirt override - instead the uniform provided in equipment is added.
/// </summary>
private string _innerClothingSkirt = default!;
public IReadOnlyDictionary<string, string> Inhand => _inHand; public IReadOnlyDictionary<string, string> Inhand => _inHand;
/// <summary> /// <summary>
/// hand index, item prototype /// hand index, item prototype
/// </summary> /// </summary>
private Dictionary<string, string> _inHand; private Dictionary<string, string> _inHand = default!;
[ViewVariables] public string ID => _id; [ViewVariables] public string ID => _id;
[ViewVariables] public IReadOnlyDictionary<Slots, string> Equipment => _equipment;
public void LoadFrom(YamlMappingNode mapping) public void LoadFrom(YamlMappingNode mapping)
{ {
var serializer = YamlObjectSerializer.NewReader(mapping); var serializer = YamlObjectSerializer.NewReader(mapping);
@@ -44,6 +49,26 @@ namespace Content.Shared.Roles
return slot; return slot;
}, type => type.Value); }, type => type.Value);
serializer.DataField(ref _innerClothingSkirt, "innerclothingskirt", string.Empty);
}
public string GetGear(Slots slot, HumanoidCharacterProfile? profile)
{
if (profile != null)
{
if ((slot == Slots.INNERCLOTHING) && (profile.Clothing == ClothingPreference.Jumpskirt) && (_innerClothingSkirt != ""))
return _innerClothingSkirt;
}
if (_equipment.ContainsKey(slot))
{
return _equipment[slot];
}
else
{
return "";
}
} }
} }
} }

View File

@@ -12,6 +12,8 @@ using NUnit.Framework;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.UnitTesting; using Robust.UnitTesting;
using Robust.Shared.IoC;
using Robust.Shared.Localization.Macros;
namespace Content.Tests.Server.Preferences namespace Content.Tests.Server.Preferences
{ {
@@ -24,6 +26,7 @@ namespace Content.Tests.Server.Preferences
"Charlie Charlieson", "Charlie Charlieson",
21, 21,
Sex.Male, Sex.Male,
Gender.Epicene,
new HumanoidCharacterAppearance( new HumanoidCharacterAppearance(
"Afro", "Afro",
Color.Aqua, Color.Aqua,
@@ -32,6 +35,7 @@ namespace Content.Tests.Server.Preferences
Color.Azure, Color.Azure,
Color.Beige Color.Beige
), ),
ClothingPreference.Jumpskirt,
new Dictionary<string, JobPriority> new Dictionary<string, JobPriority>
{ {
{SharedGameTicker.OverflowJob, JobPriority.High} {SharedGameTicker.OverflowJob, JobPriority.High}

View File

@@ -20,3 +20,5 @@
shoes: ClothingShoesColorBlack shoes: ClothingShoesColorBlack
idcard: CargoPDA idcard: CargoPDA
ears: ClothingHeadsetCargo ears: ClothingHeadsetCargo
innerclothingskirt: ClothingUniformJumpskirtCargo

View File

@@ -21,3 +21,5 @@
shoes: ClothingShoesColorBrown shoes: ClothingShoesColorBrown
idcard: QuartermasterPDA idcard: QuartermasterPDA
ears: ClothingHeadsetCargo ears: ClothingHeadsetCargo
innerclothingskirt: ClothingUniformJumpskirtQM

View File

@@ -17,3 +17,5 @@
shoes: ClothingShoesColorBlack shoes: ClothingShoesColorBlack
idcard: AssistantPDA idcard: AssistantPDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
innerclothingskirt: ClothingUniformJumpskirtColorGrey

View File

@@ -21,3 +21,5 @@
shoes: ClothingShoesColorBlack shoes: ClothingShoesColorBlack
idcard: BartenderPDA idcard: BartenderPDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
innerclothingskirt: ClothingUniformJumpskirtBartender

View File

@@ -21,3 +21,5 @@
idcard: BotanistPDA idcard: BotanistPDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
outerclothing: ClothingOuterApronBotanist outerclothing: ClothingOuterApronBotanist
innerclothingskirt: ClothingUniformJumpskirtHydroponics

View File

@@ -9,7 +9,6 @@
# access: # access:
# - Chapel # - Chapel
# - Maintenance # - Maintenance
#- type: startingGear #- type: startingGear
# id: ChaplainGear # id: ChaplainGear
# equipment: # equipment:
@@ -18,3 +17,5 @@
# shoes: ClothingShoesColorBlack # shoes: ClothingShoesColorBlack
# idcard: ChaplainPDA # idcard: ChaplainPDA
# ears: ClothingHeadsetService # ears: ClothingHeadsetService
# innerclothingskirt: ClothingUniformJumpskirtChaplain

View File

@@ -21,3 +21,5 @@
idcard: ChefPDA idcard: ChefPDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
outerclothing: ClothingOuterApronChef outerclothing: ClothingOuterApronChef
innerclothingskirt: ClothingUniformJumpskirtChef

View File

@@ -20,3 +20,5 @@
idcard: JanitorPDA idcard: JanitorPDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
belt: ClothingBeltJanitorFilled belt: ClothingBeltJanitorFilled
innerclothingskirt: ClothingUniformJumpskirtJanitor

View File

@@ -24,3 +24,5 @@
mask: ClothingMaskMime mask: ClothingMaskMime
idcard: MimePDA idcard: MimePDA
ears: ClothingHeadsetService ears: ClothingHeadsetService
innerclothingskirt: ClothingUniformJumpskirtMime

View File

@@ -28,3 +28,5 @@
head: ClothingHeadHatHopcap head: ClothingHeadHatHopcap
idcard: HoPPDA idcard: HoPPDA
ears: ClothingHeadsetAltCommand ears: ClothingHeadsetAltCommand
innerclothingskirt: ClothingUniformJumpskirtHoP

View File

@@ -25,3 +25,5 @@
idcard: CEPDA idcard: CEPDA
ears: ClothingHeadsetEngineering ears: ClothingHeadsetEngineering
belt: ClothingBeltChiefEngineerFilled belt: ClothingBeltChiefEngineerFilled
innerclothingskirt: ClothingUniformJumpskirtChiefEngineer

View File

@@ -23,3 +23,5 @@
idcard: EngineerPDA idcard: EngineerPDA
belt: ClothingBeltUtilityFilled belt: ClothingBeltUtilityFilled
ears: ClothingHeadsetEngineering ears: ClothingHeadsetEngineering
innerclothingskirt: ClothingUniformJumpskirtEngineering

View File

@@ -26,3 +26,5 @@
idcard: CMOPDA idcard: CMOPDA
ears: ClothingHeadsetAltMedical ears: ClothingHeadsetAltMedical
belt: ClothingBeltMedical belt: ClothingBeltMedical
innerclothingskirt: ClothingUniformJumpskirtCMO

View File

@@ -21,3 +21,5 @@
idcard: MedicalPDA idcard: MedicalPDA
ears: ClothingHeadsetMedical ears: ClothingHeadsetMedical
belt: ClothingBeltMedical belt: ClothingBeltMedical
innerclothingskirt: ClothingUniformJumpskirtMedicalDoctor

View File

@@ -22,3 +22,5 @@
shoes: ClothingShoesColorBrown shoes: ClothingShoesColorBrown
idcard: RnDPDA idcard: RnDPDA
ears: ClothingHeadsetScience ears: ClothingHeadsetScience
innerclothingskirt: ClothingUniformJumpskirtResearchDirector

View File

@@ -20,3 +20,5 @@
outerclothing: ClothingOuterCoatLab outerclothing: ClothingOuterCoatLab
idcard: SciencePDA idcard: SciencePDA
ears: ClothingHeadsetScience ears: ClothingHeadsetScience
innerclothingskirt: ClothingUniformJumpskirtScientist

View File

@@ -29,3 +29,5 @@
idcard: HoSPDA idcard: HoSPDA
ears: ClothingHeadsetAltSecurity ears: ClothingHeadsetAltSecurity
belt: ClothingBeltSecurityFilled belt: ClothingBeltSecurityFilled
innerclothingskirt: ClothingUniformJumpskirtHoS

View File

@@ -24,3 +24,5 @@
idcard: SecurityPDA idcard: SecurityPDA
ears: ClothingHeadsetSecurity ears: ClothingHeadsetSecurity
belt: ClothingBeltSecurityFilled belt: ClothingBeltSecurityFilled
innerclothingskirt: ClothingUniformJumpskirtSec

View File

@@ -25,3 +25,5 @@
idcard: WardenPDA idcard: WardenPDA
ears: ClothingHeadsetSecurity ears: ClothingHeadsetSecurity
belt: ClothingBeltSecurityFilled belt: ClothingBeltSecurityFilled
innerclothingskirt: ClothingUniformJumpskirtWarden