* - fix: Genitals sprite shit and meow for tajaran

* - add: fart sound if kicked from server

* - tweak: vulpies and tajaran now for donaters!!!

* - fix: Fart on exit

* - add: roleplay think

* - fix: database shit and loc

* - add: ears for slime

* - fix: LOC interaction fix

* - add: height setting

* - fix: height for felinids

* - fix: nigga fix

* - fix: no bitches on captain

* - fix: interaction panel animation shit
This commit is contained in:
Cinkafox
2024-03-11 11:13:33 +03:00
committed by GitHub
parent db920c3942
commit 95054e072a
65 changed files with 12561 additions and 91 deletions

View File

@@ -330,13 +330,14 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
// Okay so if the marking prototype is modified but we load old marking data this may no longer be valid // Okay so if the marking prototype is modified but we load old marking data this may no longer be valid
// and we need to check the index is correct. // and we need to check the index is correct.
// So if that happens just default to white? // So if that happens just default to white?
// Alpha WD EDIT
if (colors != null && j < colors.Count) if (colors != null && j < colors.Count)
{ {
sprite.LayerSetColor(layerId, colors[j]); sprite.LayerSetColor(layerId, colors[j].WithAlpha(markingPrototype.LayerAlpha));
} }
else else
{ {
sprite.LayerSetColor(layerId, Color.White); sprite.LayerSetColor(layerId, Color.White.WithAlpha(markingPrototype.LayerAlpha));
} }
} }
} }

View File

@@ -131,6 +131,15 @@
<Control HorizontalExpand="True"/> <Control HorizontalExpand="True"/>
<OptionButton Name="CSpawnPriorityButton" HorizontalAlignment="Right" /> <OptionButton Name="CSpawnPriorityButton" HorizontalAlignment="Right" />
</BoxContainer> </BoxContainer>
<!-- Height -->
<BoxContainer HorizontalExpand="True" Orientation="Vertical" Name="HeightContainer">
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
<Slider HorizontalExpand="True" Name="CHeight" MinValue="0" MaxValue="255" Value="1"/>
<BoxContainer Orientation="Horizontal">
<Label Name="CHeightInformation"/>
<Button Name="ResetHeightButton" Text="{Loc 'height-reset'}"/>
</BoxContainer>
</BoxContainer>
</BoxContainer> </BoxContainer>
<!-- Skin --> <!-- Skin -->
<BoxContainer Margin="10" HorizontalExpand="True" Orientation="Vertical"> <BoxContainer Margin="10" HorizontalExpand="True" Orientation="Vertical">
@@ -178,6 +187,12 @@
<humanoid:MarkingPicker Name="CMarkings" IgnoreCategories="Hair,FacialHair" /> <humanoid:MarkingPicker Name="CMarkings" IgnoreCategories="Hair,FacialHair" />
</ScrollContainer> </ScrollContainer>
</BoxContainer> </BoxContainer>
<BoxContainer Name="CRolePlayThinkTab" Orientation="Vertical" Margin="10">
<!-- RolePlay sel -->
<ScrollContainer VerticalExpand="True">
<BoxContainer Name="CRolePlayThing" Orientation="Vertical"></BoxContainer>
</ScrollContainer>
</BoxContainer>
</TabContainer> </TabContainer>
</BoxContainer> </BoxContainer>
<!-- Right side --> <!-- Right side -->

View File

@@ -8,6 +8,7 @@ using Content.Client.Message;
using Content.Client.Players.PlayTimeTracking; using Content.Client.Players.PlayTimeTracking;
using Content.Client.Stylesheets; using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Controls;
using Content.Shared._Amour.RoleplayInfo;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.CCVar; using Content.Shared.CCVar;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
@@ -85,6 +86,8 @@ namespace Content.Client.Preferences.UI
//WD-EDIT //WD-EDIT
private OptionButton _voiceButton => CVoiceButton; private OptionButton _voiceButton => CVoiceButton;
private Button _voicePlayButton => CVoicePlayButton; private Button _voicePlayButton => CVoicePlayButton;
private BoxContainer _rolePlayThink => CRolePlayThing;
private List<RolePlaySelector> _roleplaySelections = new();
//WD-EDIT //WD-EDIT
private Slider _skinColor => CSkin; private Slider _skinColor => CSkin;
@@ -220,6 +223,10 @@ namespace Content.Client.Preferences.UI
#region Genitals #region Genitals
InitializeGenitals(); InitializeGenitals();
#endregion #endregion
#region height
InitializeHeight();
#endregion
//AMOUR END //AMOUR END
#region Species #region Species
@@ -242,6 +249,7 @@ namespace Content.Client.Preferences.UI
SetSpecies(_speciesList[args.Id].ID); SetSpecies(_speciesList[args.Id].ID);
UpdateHairPickers(); UpdateHairPickers();
OnSkinColorOnValueChanged(); OnSkinColorOnValueChanged();
UpdateHeightControl(); // AMOUR
}; };
#endregion Species #endregion Species
@@ -545,6 +553,27 @@ namespace Content.Client.Preferences.UI
#endregion FlavorText #endregion FlavorText
//WD EDIT
#region RolePlayThink
_tabContainer.SetTabTitle(5, Loc.GetString("roleplay-tab"));
_rolePlayThink.DisposeAllChildren();
_roleplaySelections.Clear();
foreach (var proto in prototypeManager.EnumeratePrototypes<RoleplayInfoPrototype>())
{
var think = new RolePlaySelector(proto.ID);
think.PreferenceChanged += selection =>
{
Profile = Profile?.WithRoleplaySelection(proto.ID, selection);
IsDirty = true;
};
_roleplaySelections.Add(think);
_rolePlayThink.Children.Add(think);
}
#endregion
//WD END EDIT
#region Dummy #region Dummy
_previewRotateLeftButton.OnPressed += _ => _previewRotateLeftButton.OnPressed += _ =>
@@ -1286,6 +1315,8 @@ namespace Content.Client.Preferences.UI
//Amour edit //Amour edit
UpdateGenitalsControls(); UpdateGenitalsControls();
UpdateRoleplayThink();
UpdateHeightControl();
//Amour edit //Amour edit
_preferenceUnavailableButton.SelectId((int) Profile.PreferenceUnavailable); _preferenceUnavailableButton.SelectId((int) Profile.PreferenceUnavailable);
@@ -1603,5 +1634,74 @@ namespace Content.Client.Preferences.UI
PreferenceChanged?.Invoke(Preference); PreferenceChanged?.Invoke(Preference);
} }
} }
private sealed class RolePlaySelector : Control
{
private readonly RadioOptions<RoleplaySelection> _options;
public RoleplaySelection Preference
{
get => _options.SelectedValue;
set => _options.SelectByValue(value);
}
public string RolePlayId { get; }
public event Action<RoleplaySelection>? PreferenceChanged;
public RolePlaySelector(string rolePlayId)
{
RolePlayId = rolePlayId;
_options = new RadioOptions<RoleplaySelection>(RadioOptionsLayout.Horizontal)
{
FirstButtonStyle = StyleBase.ButtonOpenRight,
ButtonStyle = StyleBase.ButtonOpenBoth,
LastButtonStyle = StyleBase.ButtonOpenLeft
};
_options.GenerateItem = (text, _) => new Button
{
Text = text,
MinWidth = 90
};
_options.OnItemSelected += args => _options.Select(args.Id);
var titleLabel = new Label()
{
Margin = new Thickness(5f, 0, 5f, 0),
Text = Loc.GetString("roleplay-name-" + rolePlayId.ToLower()),
MouseFilter = MouseFilterMode.Stop,
ToolTip = Loc.GetString("roleplay-desc-" + rolePlayId.ToLower())
};
_options.OnItemSelected += _ => PreferenceChanged?.Invoke(Preference);
_options.AddItem(Loc.GetString("roleplay-no"), RoleplaySelection.No);
_options.AddItem(Loc.GetString("roleplay-maybe"), RoleplaySelection.Maybe);
_options.AddItem(Loc.GetString("roleplay-yes"), RoleplaySelection.Yes);
titleLabel.HorizontalAlignment = HAlignment.Left;
_options.HorizontalAlignment = HAlignment.Center;
AddChild(titleLabel);
AddChild(_options);
HorizontalExpand = true;
}
}
private void UpdateRoleplayThink()
{
if(Profile is null)
return;
foreach (var selector in _roleplaySelections)
{
if (Profile.RoleplayInfoData.TryGetValue(selector.RolePlayId, out var value))
{
selector.Preference = value.RoleplaySelection;
}
}
}
} }
} }

View File

@@ -0,0 +1,25 @@
using System.Numerics;
using Content.Shared._Amour.CustomHeight;
using Robust.Client.GameObjects;
namespace Content.Client._Amour.CustomHeight;
public sealed class CustomHeightSystem : SharedCustomHeightSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CustomHeightComponent,AppearanceChangeEvent>(OnHeightChange);
}
private void OnHeightChange(EntityUid uid, CustomHeightComponent component, AppearanceChangeEvent args)
{
if(args.Sprite is null || !AppearanceSystem.TryGetData<float>(uid, HeightVisuals.State, out var height))
return;
height = Math.Clamp(height, component.Min, component.Max);
args.Sprite.Scale = new Vector2(height);
}
}

View File

@@ -0,0 +1,78 @@
using Content.Client._Amour.CustomHeight;
using Content.Shared._Amour.CustomHeight;
using Content.Shared._Amour.LoggerExtension;
using Robust.Client.UserInterface.Controls;
using Range = Robust.Client.UserInterface.Controls.Range;
namespace Content.Client.Preferences.UI;
public sealed partial class HumanoidProfileEditor
{
private Slider _height => CHeight;
private Label _heightInformation => CHeightInformation;
private CustomHeightSystem _customHeightSystem = default!;
public void InitializeHeight()
{
_customHeightSystem = _entMan.System<CustomHeightSystem>();
_height.OnValueChanged += HeightValueChanged;
ResetHeightButton.OnPressed += ResetHeightButtonOnOnPressed;
}
private void ResetHeightButtonOnOnPressed(BaseButton.ButtonEventArgs obj)
{
if (_entMan.TryGetComponent<CustomHeightComponent>(_previewDummy, out var heightComponent))
{
SetDummyHeight(_customHeightSystem.GetByteFromHeight(_previewDummy.Value, heightComponent.Starting));
}
}
private void HeightValueChanged(Range obj)
{
SetDummyHeight((byte) _height.Value,false);
}
public void UpdateHeightControl()
{
if (Profile is null)
return;
if (!_entMan.TryGetComponent<CustomHeightComponent>(_previewDummy, out _))
{
HeightContainer.Visible = false;
return;
}
HeightContainer.Visible = true;
_height.Value = Profile.Appearance.Height;
UpdateHeightText();
}
public void SetDummyHeight(byte height, bool changeHeightValue = true)
{
if (Profile is null || !_entMan.TryGetComponent<CustomHeightComponent>(_previewDummy, out var a))
return;
if(changeHeightValue)
_height.Value = height;
Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithHeight(height));
UpdateHeightText();
IsDirty = true;
}
public void UpdateHeightText()
{
if (_entMan.TryGetComponent<CustomHeightComponent>(_previewDummy, out _))
{
var height = (int)(_customHeightSystem
.GetHeightFromByte(_previewDummy.Value, (byte) _height.Value) * 180);
_heightInformation.Text = Loc.GetString("humanoid-profile-height-current") + height;
}
}
}

View File

@@ -0,0 +1,31 @@
using Content.Client.Gameplay;
using Content.Client.Launcher;
using Robust.Client.Audio;
using Robust.Client.ResourceManagement;
using Robust.Client.State;
namespace Content.Client._Amour.Fart;
public sealed class FartSystem : EntitySystem
{
[Dependency] private readonly IStateManager _stateManager = default!;
[Dependency] private readonly IAudioManager _audioManager = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
public const string FartPath = "/Audio/_Amour/fart-with-reverb.ogg";
private AudioResource _audioResource = default!;
public override void Initialize()
{
_audioResource = _resourceCache.GetResource<AudioResource>(FartPath);
_stateManager.OnStateChanged += StateManagerOnOnStateChanged;
}
private void StateManagerOnOnStateChanged(StateChangedEventArgs obj)
{
if(obj.OldState is not GameplayState || obj.NewState is not LauncherConnecting)
return;
_audioManager.CreateAudioSource(_audioResource.AudioStream)?.StartPlaying();
}
}

View File

@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Content.Server.Database; using Content.Server.Database;
using Content.Shared._Amour.RoleplayInfo;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Humanoid; using Content.Shared.Humanoid;
using Content.Shared.Preferences; using Content.Shared.Preferences;
@@ -12,6 +13,7 @@ using Robust.Shared.Log;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.UnitTesting; using Robust.UnitTesting;
using RoleplayInfo = Content.Shared._Amour.RoleplayInfo.RoleplayInfo;
namespace Content.IntegrationTests.Tests.Preferences namespace Content.IntegrationTests.Tests.Preferences
{ {
@@ -55,7 +57,7 @@ namespace Content.IntegrationTests.Tests.Preferences
"Shaved", "Shaved",
Color.Aquamarine, Color.Aquamarine,
Color.Azure, Color.Azure,
Color.Beige, Color.Beige,128,
new (), new() //AMOUR new (), new() //AMOUR
), ),
ClothingPreference.Jumpskirt, ClothingPreference.Jumpskirt,
@@ -67,7 +69,8 @@ namespace Content.IntegrationTests.Tests.Preferences
}, },
PreferenceUnavailableMode.StayInLobby, PreferenceUnavailableMode.StayInLobby,
new List<string> (), new List<string> (),
new List<string>() new List<string>(),
new Dictionary<string, RoleplayInfo>() //AMOUR
); );
} }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class RolePlayThink : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "roleplay_info",
columns: table => new
{
roleplay_info_id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
profile_id = table.Column<int>(type: "integer", nullable: false),
name = table.Column<string>(type: "text", nullable: false),
value = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_roleplay_info", x => x.roleplay_info_id);
table.ForeignKey(
name: "FK_roleplay_info_profile_profile_id",
column: x => x.profile_id,
principalTable: "profile",
principalColumn: "profile_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "roleplay_info");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class RPMigrationEblya : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info");
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" },
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info");
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" });
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class HeightPrikoli : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<byte>(
name: "height",
table: "profile",
type: "smallint",
nullable: false,
defaultValue: (byte)0);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "height",
table: "profile");
}
}
}

View File

@@ -852,6 +852,10 @@ namespace Content.Server.Database.Migrations.Postgres
.HasColumnType("text") .HasColumnType("text")
.HasColumnName("hair_name"); .HasColumnName("hair_name");
b.Property<byte>("Height")
.HasColumnType("smallint")
.HasColumnName("height");
b.Property<JsonDocument>("Markings") b.Property<JsonDocument>("Markings")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("markings"); .HasColumnName("markings");
@@ -909,6 +913,37 @@ namespace Content.Server.Database.Migrations.Postgres
b.ToTable("profile", (string)null); b.ToTable("profile", (string)null);
}); });
modelBuilder.Entity("Content.Server.Database.RoleplayInfo", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("roleplay_info_id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");
b.Property<int>("ProfileId")
.HasColumnType("integer")
.HasColumnName("profile_id");
b.Property<int>("Value")
.HasColumnType("integer")
.HasColumnName("value");
b.HasKey("Id")
.HasName("PK_roleplay_info");
b.HasIndex("ProfileId", "Name")
.IsUnique();
b.ToTable("roleplay_info", (string)null);
});
modelBuilder.Entity("Content.Server.Database.Round", b => modelBuilder.Entity("Content.Server.Database.Round", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@@ -1618,6 +1653,18 @@ namespace Content.Server.Database.Migrations.Postgres
b.Navigation("Preference"); b.Navigation("Preference");
}); });
modelBuilder.Entity("Content.Server.Database.RoleplayInfo", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("RoleplayInfo")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("FK_roleplay_info_profile_profile_id");
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.Round", b => modelBuilder.Entity("Content.Server.Database.Round", b =>
{ {
b.HasOne("Content.Server.Database.Server", "Server") b.HasOne("Content.Server.Database.Server", "Server")
@@ -1832,6 +1879,8 @@ namespace Content.Server.Database.Migrations.Postgres
b.Navigation("Jobs"); b.Navigation("Jobs");
b.Navigation("RoleplayInfo");
b.Navigation("Traits"); b.Navigation("Traits");
}); });

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class RolePlayThink : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "roleplay_info",
columns: table => new
{
roleplay_info_id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
profile_id = table.Column<int>(type: "INTEGER", nullable: false),
name = table.Column<string>(type: "TEXT", nullable: false),
value = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_roleplay_info", x => x.roleplay_info_id);
table.ForeignKey(
name: "FK_roleplay_info_profile_profile_id",
column: x => x.profile_id,
principalTable: "profile",
principalColumn: "profile_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "roleplay_info");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class RPMigrationEblya : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info");
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" },
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info");
migrationBuilder.CreateIndex(
name: "IX_roleplay_info_profile_id_name",
table: "roleplay_info",
columns: new[] { "profile_id", "name" });
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class HeightPrikoli : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<byte>(
name: "height",
table: "profile",
type: "INTEGER",
nullable: false,
defaultValue: (byte)0);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "height",
table: "profile");
}
}
}

View File

@@ -801,6 +801,10 @@ namespace Content.Server.Database.Migrations.Sqlite
.HasColumnType("TEXT") .HasColumnType("TEXT")
.HasColumnName("hair_name"); .HasColumnName("hair_name");
b.Property<byte>("Height")
.HasColumnType("INTEGER")
.HasColumnName("height");
b.Property<byte[]>("Markings") b.Property<byte[]>("Markings")
.HasColumnType("jsonb") .HasColumnType("jsonb")
.HasColumnName("markings"); .HasColumnName("markings");
@@ -858,6 +862,35 @@ namespace Content.Server.Database.Migrations.Sqlite
b.ToTable("profile", (string)null); b.ToTable("profile", (string)null);
}); });
modelBuilder.Entity("Content.Server.Database.RoleplayInfo", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("roleplay_info_id");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("name");
b.Property<int>("ProfileId")
.HasColumnType("INTEGER")
.HasColumnName("profile_id");
b.Property<int>("Value")
.HasColumnType("INTEGER")
.HasColumnName("value");
b.HasKey("Id")
.HasName("PK_roleplay_info");
b.HasIndex("ProfileId", "Name")
.IsUnique();
b.ToTable("roleplay_info", (string)null);
});
modelBuilder.Entity("Content.Server.Database.Round", b => modelBuilder.Entity("Content.Server.Database.Round", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@@ -1545,6 +1578,18 @@ namespace Content.Server.Database.Migrations.Sqlite
b.Navigation("Preference"); b.Navigation("Preference");
}); });
modelBuilder.Entity("Content.Server.Database.RoleplayInfo", b =>
{
b.HasOne("Content.Server.Database.Profile", "Profile")
.WithMany("RoleplayInfo")
.HasForeignKey("ProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("FK_roleplay_info_profile_profile_id");
b.Navigation("Profile");
});
modelBuilder.Entity("Content.Server.Database.Round", b => modelBuilder.Entity("Content.Server.Database.Round", b =>
{ {
b.HasOne("Content.Server.Database.Server", "Server") b.HasOne("Content.Server.Database.Server", "Server")
@@ -1759,6 +1804,8 @@ namespace Content.Server.Database.Migrations.Sqlite
b.Navigation("Jobs"); b.Navigation("Jobs");
b.Navigation("RoleplayInfo");
b.Navigation("Traits"); b.Navigation("Traits");
}); });

View File

@@ -64,6 +64,10 @@ namespace Content.Server.Database
.HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.GenitalPrototype }) .HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.GenitalPrototype })
.IsUnique(); .IsUnique();
modelBuilder.Entity<RoleplayInfo>()
.HasIndex(r => new { HumanoidProfileId = r.ProfileId, r.Name })
.IsUnique();
modelBuilder.Entity<Job>() modelBuilder.Entity<Job>()
.HasIndex(j => j.ProfileId); .HasIndex(j => j.ProfileId);
@@ -329,6 +333,15 @@ namespace Content.Server.Database
public string Color { get; set; } = null!; public string Color { get; set; } = null!;
} }
public class RoleplayInfo
{
public int Id { get; set; }
public Profile Profile { get; set; } = null!;
public int ProfileId { get; set; }
public string Name { get; set; } = null!;
public int Value { get; set; }
}
// Amour end // Amour end
public class Preference public class Preference
@@ -361,6 +374,7 @@ namespace Content.Server.Database
//WD-EDIT //WD-EDIT
public string BodyType { get; set; } = null!; public string BodyType { get; set; } = null!;
public string Voice { get; set; } = null!; public string Voice { get; set; } = null!;
public byte Height { get; set; }
//WD-EDIT //WD-EDIT
public string Species { get; set; } = null!; public string Species { get; set; } = null!;
@@ -377,7 +391,8 @@ namespace Content.Server.Database
public List<Job> Jobs { get; } = new(); public List<Job> Jobs { get; } = new();
public List<Antag> Antags { get; } = new(); public List<Antag> Antags { get; } = new();
public List<Trait> Traits { get; } = new(); public List<Trait> Traits { get; } = new();
public List<Genital> Genitals { get; } = new(); public List<Genital> Genitals { get; } = new(); //AMOUR
public List<RoleplayInfo> RoleplayInfo { get; } = new(); //AMOUR
[Column("pref_unavailable")] public DbPreferenceUnavailableMode PreferenceUnavailable { get; set; } [Column("pref_unavailable")] public DbPreferenceUnavailableMode PreferenceUnavailable { get; set; }

View File

@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using Content.Server.Administration.Logs; using Content.Server.Administration.Logs;
using Content.Server.Administration.Managers; using Content.Server.Administration.Managers;
using Content.Shared._Amour.Hole; using Content.Shared._Amour.Hole;
using Content.Shared._Amour.RoleplayInfo;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.Database; using Content.Shared.Database;
using Content.Shared.Humanoid; using Content.Shared.Humanoid;
@@ -43,6 +44,7 @@ namespace Content.Server.Database
.Include(p => p.Profiles).ThenInclude(h => h.Antags) .Include(p => p.Profiles).ThenInclude(h => h.Antags)
.Include(p => p.Profiles).ThenInclude(h => h.Traits) .Include(p => p.Profiles).ThenInclude(h => h.Traits)
.Include(p => p.Profiles).ThenInclude(h => h.Genitals) .Include(p => p.Profiles).ThenInclude(h => h.Genitals)
.Include(p => p.Profiles).ThenInclude(h => h.RoleplayInfo)
.AsSingleQuery() .AsSingleQuery()
.SingleOrDefaultAsync(p => p.UserId == userId.UserId); .SingleOrDefaultAsync(p => p.UserId == userId.UserId);
@@ -92,6 +94,7 @@ namespace Content.Server.Database
.Include(p => p.Antags) .Include(p => p.Antags)
.Include(p => p.Traits) .Include(p => p.Traits)
.Include(p => p.Genitals) .Include(p => p.Genitals)
.Include(p => p.RoleplayInfo)
.AsSplitQuery() .AsSplitQuery()
.SingleOrDefault(h => h.Slot == slot); .SingleOrDefault(h => h.Slot == slot);
@@ -178,6 +181,10 @@ 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 traits = profile.Traits.Select(t => t.TraitName); var traits = profile.Traits.Select(t => t.TraitName);
var roleplayInfo = profile.RoleplayInfo
.Select(r =>
new Shared._Amour.RoleplayInfo.RoleplayInfo(r.Name, (RoleplaySelection) r.Value))
.ToDictionary(a => a.Name);
var sex = Sex.Male; var sex = Sex.Male;
if (Enum.TryParse<Sex>(profile.Sex, true, out var sexVal)) if (Enum.TryParse<Sex>(profile.Sex, true, out var sexVal))
@@ -242,6 +249,7 @@ namespace Content.Server.Database
Color.FromHex(profile.FacialHairColor), Color.FromHex(profile.FacialHairColor),
Color.FromHex(profile.EyeColor), Color.FromHex(profile.EyeColor),
Color.FromHex(profile.SkinColor), Color.FromHex(profile.SkinColor),
profile.Height, // AMOUR EDIT
markings, genitals.ToList() // Amour edit markings, genitals.ToList() // Amour edit
), ),
clothing, clothing,
@@ -250,7 +258,8 @@ namespace Content.Server.Database
jobs, jobs,
(PreferenceUnavailableMode) profile.PreferenceUnavailable, (PreferenceUnavailableMode) profile.PreferenceUnavailable,
antags.ToList(), antags.ToList(),
traits.ToList() traits.ToList(),
roleplayInfo
); );
} }
@@ -288,7 +297,7 @@ namespace Content.Server.Database
profile.Slot = slot; profile.Slot = slot;
profile.PreferenceUnavailable = (DbPreferenceUnavailableMode) humanoid.PreferenceUnavailable; profile.PreferenceUnavailable = (DbPreferenceUnavailableMode) humanoid.PreferenceUnavailable;
profile.Voice = humanoid.Voice; profile.Voice = humanoid.Voice;
profile.Height = appearance.Height; // AMOUR
profile.Jobs.Clear(); profile.Jobs.Clear();
profile.Jobs.AddRange( profile.Jobs.AddRange(
humanoid.JobPriorities humanoid.JobPriorities
@@ -316,6 +325,15 @@ namespace Content.Server.Database
Color = t.Color?.ToHex() ?? "" Color = t.Color?.ToHex() ?? ""
})); }));
profile.RoleplayInfo.Clear();
profile.RoleplayInfo.AddRange(
humanoid.RoleplayInfoData.Select(r => new RoleplayInfo()
{
Name = r.Value.Name,
Value = (int) r.Value.RoleplaySelection
})
);
return profile; return profile;
} }
#endregion #endregion

View File

@@ -0,0 +1,9 @@
using Content.Shared._Amour.CustomHeight;
using Robust.Server.GameObjects;
namespace Content.Server._Amour.CustomHeight;
public sealed class CustomHeightSystem : SharedCustomHeightSystem
{
}

View File

@@ -0,0 +1,28 @@
using Content.Server.Humanoid;
using Content.Shared._Amour.RoleplayInfo;
using Content.Shared.Examine;
namespace Content.Server._Amour.RoleplayInfo;
public sealed class RoleplayInfoSystem : SharedRoleplaySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoleplayInfoComponent,ExaminedEvent>(OnExamined);
}
private void OnExamined(EntityUid uid, RoleplayInfoComponent component, ExaminedEvent args)
{
if(component.Data.Count == 0)
return;
args.PushText($"\n{Loc.GetString("roleplay-info")}",-1);
foreach (var data in component.Data)
{
args.PushMarkup($"[bold]{Loc.GetString("roleplay-name-" + data.Name.ToLower())}[/bold] - {Loc.GetString("roleplay-" + data.RoleplaySelection.ToString().ToLower())}",-1);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.Linq;
using Content.Server._White.Sponsors;
using Content.Shared._Amour.Sponsor;
using Content.Shared._White.Sponsors;
using Robust.Shared.Prototypes;
namespace Content.Server._Amour.Sponsor;
public sealed class SponsorSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public override void Initialize()
{
SubscribeLocalEvent<SponsorInfoLoadEvent>(OnSponsorLoaded);
}
private void OnSponsorLoaded(ref SponsorInfoLoadEvent ev)
{
if(ev.SponsorInfo.Tier is null || !_prototypeManager.TryIndex<SponsorItemPrototype>(ev.SponsorInfo.Tier.Value.ToString(), out var prototype))
return;
ev.SponsorInfo.AllowedMarkings = ev.SponsorInfo.AllowedMarkings.Concat(prototype.Items).ToArray();
}
}

View File

@@ -12,6 +12,7 @@ using Content.Server.Popups;
using Content.Server.Store.Components; using Content.Server.Store.Components;
using Content.Server.Store.Systems; using Content.Server.Store.Systems;
using Content.Server._White.Sponsors; using Content.Server._White.Sponsors;
using Content.Server.Administration.Managers;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Humanoid; using Content.Shared.Humanoid;
@@ -27,6 +28,7 @@ using Content.Shared._White.MeatyOre;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Content.Shared._White; using Content.Shared._White;
using Content.Shared._White.MeatyOre; using Content.Shared._White.MeatyOre;
using Content.Shared.Database;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Server.GameStates; using Robust.Server.GameStates;
@@ -52,6 +54,7 @@ public sealed class MeatyOreStoreSystem : EntitySystem
[Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!;
[Dependency] private readonly SharedJobSystem _jobSystem = default!; [Dependency] private readonly SharedJobSystem _jobSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly IBanManager _banManager = default!;
private HttpClient _httpClient = default!; private HttpClient _httpClient = default!;
@@ -105,7 +108,8 @@ public sealed class MeatyOreStoreSystem : EntitySystem
Message = $"Цена - {MeatyOreCurrencyPrototype}:10", Message = $"Цена - {MeatyOreCurrencyPrototype}:10",
Act = () => Act = () =>
{ {
TryAddRole(ev.User, ev.Target, store); //TryAddRole(ev.User, ev.Target, store);
TryBanDolboeb(actorComponent.PlayerSession);
}, },
Category = VerbCategory.MeatyOre Category = VerbCategory.MeatyOre
}; };
@@ -255,6 +259,22 @@ public sealed class MeatyOreStoreSystem : EntitySystem
} }
} }
private async void TryBanDolboeb(ICommonSession session)
{
if(_banManager.GetServerBans(session.UserId).Count > 0)
return;
_banManager.CreateServerBan(session.UserId,
session.Name,
null,
null,
null,
2880,
NoteSeverity.Minor,
"Кусок дерьма, блядина нахуй! У НАС АНТАЖКУ ВЫДАВАТЬ ЗАПРЕЩЕНО НАХУЙ!!!! ЧТОБ ТЯ ВЫЕБАЛИ СТО НЕГРОВ НАХУЙ!",
false);
}
private async Task<bool> GrantAntagonist(string ckey, bool isFriend) private async Task<bool> GrantAntagonist(string ckey, bool isFriend)
{ {
var result = false; var result = false;

View File

@@ -16,6 +16,7 @@ public sealed class SponsorsManager
{ {
[Dependency] private readonly IServerNetManager _netMgr = default!; [Dependency] private readonly IServerNetManager _netMgr = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
private readonly HttpClient _httpClient = new(); private readonly HttpClient _httpClient = new();
@@ -50,6 +51,10 @@ public sealed class SponsorsManager
return; return;
} }
//AMOUR START
var ev = new SponsorInfoLoadEvent(info);
_entityManager.EventBus.RaiseEvent(EventSource.Local,ref ev);
//AMOUR END
DebugTools.Assert(!_cachedSponsors.ContainsKey(e.UserId), "Cached data was found on client connect"); DebugTools.Assert(!_cachedSponsors.ContainsKey(e.UserId), "Cached data was found on client connect");
_cachedSponsors[e.UserId] = info; _cachedSponsors[e.UserId] = info;
@@ -90,3 +95,7 @@ public sealed class SponsorsManager
return await response.Content.ReadFromJsonAsync<SponsorInfo>(); return await response.Content.ReadFromJsonAsync<SponsorInfo>();
} }
} }
//AMOUR CLASS
[ByRefEvent]
public record struct SponsorInfoLoadEvent(SponsorInfo SponsorInfo);

View File

@@ -19,6 +19,7 @@ namespace Content.Shared.Humanoid
Color facialHairColor, Color facialHairColor,
Color eyeColor, Color eyeColor,
Color skinColor, Color skinColor,
byte height,
List<Marking> markings, List<Genital> genitals) List<Marking> markings, List<Genital> genitals)
{ {
HairStyleId = hairStyleId; HairStyleId = hairStyleId;
@@ -29,6 +30,7 @@ namespace Content.Shared.Humanoid
SkinColor = ClampColor(skinColor); SkinColor = ClampColor(skinColor);
Markings = markings; Markings = markings;
Genitals = genitals; Genitals = genitals;
Height = height;
} }
[DataField("hair")] [DataField("hair")]
@@ -53,49 +55,57 @@ namespace Content.Shared.Humanoid
public List<Marking> Markings { get; private set; } public List<Marking> Markings { get; private set; }
[DataField("genitals")] [DataField("genitals")]
public List<Genital> Genitals { get; private set; }//AMOUR public List<Genital> Genitals { get; private set; } //AMOUR
[DataField] public byte Height { get; private set; } //AMOUR
public HumanoidCharacterAppearance WithHairStyleName(string newName) public HumanoidCharacterAppearance WithHairStyleName(string newName)
{ {
return new(newName, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings, Genitals); return new(newName, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Height, Markings, Genitals);
} }
public HumanoidCharacterAppearance WithHairColor(Color newColor) public HumanoidCharacterAppearance WithHairColor(Color newColor)
{ {
return new(HairStyleId, newColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings , Genitals); return new(HairStyleId, newColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Height, Markings , Genitals);
} }
public HumanoidCharacterAppearance WithFacialHairStyleName(string newName) public HumanoidCharacterAppearance WithFacialHairStyleName(string newName)
{ {
return new(HairStyleId, HairColor, newName, FacialHairColor, EyeColor, SkinColor, Markings , Genitals); return new(HairStyleId, HairColor, newName, FacialHairColor, EyeColor, SkinColor, Height, Markings , Genitals);
} }
public HumanoidCharacterAppearance WithFacialHairColor(Color newColor) public HumanoidCharacterAppearance WithFacialHairColor(Color newColor)
{ {
return new(HairStyleId, HairColor, FacialHairStyleId, newColor, EyeColor, SkinColor, Markings , Genitals); return new(HairStyleId, HairColor, FacialHairStyleId, newColor, EyeColor, SkinColor, Height, Markings , Genitals);
} }
public HumanoidCharacterAppearance WithEyeColor(Color newColor) public HumanoidCharacterAppearance WithEyeColor(Color newColor)
{ {
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, newColor, SkinColor, Markings , Genitals); return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, newColor, SkinColor, Height, Markings , Genitals);
} }
public HumanoidCharacterAppearance WithSkinColor(Color newColor) public HumanoidCharacterAppearance WithSkinColor(Color newColor)
{ {
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Markings , Genitals); return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Height, Markings , Genitals);
} }
public HumanoidCharacterAppearance WithMarkings(List<Marking> newMarkings) public HumanoidCharacterAppearance WithMarkings(List<Marking> newMarkings)
{ {
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings , Genitals); return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Height, newMarkings , Genitals);
} }
public HumanoidCharacterAppearance WithGenitals(List<Genital> genitals) public HumanoidCharacterAppearance WithGenitals(List<Genital> genitals)
{ {
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings, return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Height, Markings,
genitals); genitals);
} }
public HumanoidCharacterAppearance WithHeight(byte height)
{
return new (HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, height, Markings,
Genitals);
}
public HumanoidCharacterAppearance(List<Genital> genitals) : this( public HumanoidCharacterAppearance(List<Genital> genitals) : this(
HairStyles.DefaultHairStyle, HairStyles.DefaultHairStyle,
Color.Black, Color.Black,
@@ -103,6 +113,7 @@ namespace Content.Shared.Humanoid
Color.Black, Color.Black,
Color.Black, Color.Black,
Humanoid.SkinColor.ValidHumanSkinTone, Humanoid.SkinColor.ValidHumanSkinTone,
128,
new List<Marking>(), genitals new List<Marking>(), genitals
) )
{ {
@@ -132,7 +143,7 @@ namespace Content.Shared.Humanoid
HairStyles.DefaultFacialHairStyle, HairStyles.DefaultFacialHairStyle,
Color.Black, Color.Black,
Color.Black, Color.Black,
skinColor, skinColor,128,
new (), new() new (), new()
); );
} }
@@ -195,8 +206,10 @@ namespace Content.Shared.Humanoid
newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor);
} }
var height = random.NextByte(byte.MaxValue);
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, return new HumanoidCharacterAppearance(newHairStyle, newHairColor,
newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new (), new()); newFacialHairStyle, newHairColor, newEyeColor, newSkinColor,height, new (), new());
float RandomizeColor(float channel) float RandomizeColor(float channel)
{ {
@@ -272,7 +285,7 @@ namespace Content.Shared.Humanoid
facialHairStyleId, facialHairStyleId,
facialHairColor, facialHairColor,
eyeColor, eyeColor,
skinColor, skinColor, appearance.Height,
markingSet.GetForwardEnumerator().ToList(),genitals); markingSet.GetForwardEnumerator().ToList(),genitals);
} }
@@ -296,7 +309,7 @@ namespace Content.Shared.Humanoid
facialHairStyleId, facialHairStyleId,
facialHairColor, facialHairColor,
eyeColor, eyeColor,
skinColor, skinColor, appearance.Height,
markingSet.GetForwardEnumerator().ToList(), genitals); markingSet.GetForwardEnumerator().ToList(), genitals);
} }

View File

@@ -25,6 +25,8 @@ namespace Content.Shared.Humanoid.Markings
// WD-EDIT // WD-EDIT
[DataField("sponsorOnly")] public bool SponsorOnly; [DataField("sponsorOnly")] public bool SponsorOnly;
[DataField("layerAlpha")]
public float LayerAlpha { get; private set; } = 1.0f;
// WD-EDIT // WD-EDIT
[DataField("followSkinColor")] [DataField("followSkinColor")]

View File

@@ -5,7 +5,7 @@ public static class SkinColor
public const float MaxTintedHuesSaturation = 0.1f; public const float MaxTintedHuesSaturation = 0.1f;
public const float MinTintedHuesLightness = 0.85f; public const float MinTintedHuesLightness = 0.85f;
public const float MinHuesLightness = 0.175f; public const float MinHuesLightness = 0.1f; // Я не расист, я хочу видеть негров
public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f)); public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f));
@@ -144,7 +144,7 @@ public static class SkinColor
/// This takes in a color, and returns a color guaranteed to be above MinHuesLightness /// This takes in a color, and returns a color guaranteed to be above MinHuesLightness
/// </summary> /// </summary>
/// <param name="color"></param> /// <param name="color"></param>
/// <returns>Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness</returns> /// <returns>Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness</returns>
public static Color MakeHueValid(Color color) public static Color MakeHueValid(Color color)
{ {
var manipulatedColor = Color.ToHsv(color); var manipulatedColor = Color.ToHsv(color);

View File

@@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Content.Shared._Amour.RoleplayInfo;
using Content.Shared.CCVar; using Content.Shared.CCVar;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Humanoid; using Content.Shared.Humanoid;
@@ -24,11 +25,12 @@ namespace Content.Shared.Preferences
public sealed partial class HumanoidCharacterProfile : ICharacterProfile public sealed partial class HumanoidCharacterProfile : ICharacterProfile
{ {
public const int MaxNameLength = 32; public const int MaxNameLength = 32;
public const int MaxDescLength = 512; public const int MaxDescLength = 1024;
private readonly Dictionary<string, JobPriority> _jobPriorities; private readonly Dictionary<string, JobPriority> _jobPriorities;
private readonly List<string> _antagPreferences; private readonly List<string> _antagPreferences;
private readonly List<string> _traitPreferences; private readonly List<string> _traitPreferences;
private readonly Dictionary<string,RoleplayInfo> _roleplayInfoData; //AMOUR
private HumanoidCharacterProfile( private HumanoidCharacterProfile(
string name, string name,
@@ -49,7 +51,8 @@ namespace Content.Shared.Preferences
Dictionary<string, JobPriority> jobPriorities, Dictionary<string, JobPriority> jobPriorities,
PreferenceUnavailableMode preferenceUnavailable, PreferenceUnavailableMode preferenceUnavailable,
List<string> antagPreferences, List<string> antagPreferences,
List<string> traitPreferences) List<string> traitPreferences,
Dictionary<string,RoleplayInfo> roleplayInfoData)
{ {
Name = name; Name = name;
ClownName = clownName; ClownName = clownName;
@@ -70,6 +73,7 @@ namespace Content.Shared.Preferences
PreferenceUnavailable = preferenceUnavailable; PreferenceUnavailable = preferenceUnavailable;
_antagPreferences = antagPreferences; _antagPreferences = antagPreferences;
_traitPreferences = traitPreferences; _traitPreferences = traitPreferences;
_roleplayInfoData = roleplayInfoData;
} }
/// <summary>Copy constructor but with overridable references (to prevent useless copies)</summary> /// <summary>Copy constructor but with overridable references (to prevent useless copies)</summary>
@@ -77,18 +81,18 @@ namespace Content.Shared.Preferences
HumanoidCharacterProfile other, HumanoidCharacterProfile other,
Dictionary<string, JobPriority> jobPriorities, Dictionary<string, JobPriority> jobPriorities,
List<string> antagPreferences, List<string> antagPreferences,
List<string> traitPreferences) List<string> traitPreferences, Dictionary<string,RoleplayInfo> roleplayInfoData)
: this(other.Name, other.ClownName, other.MimeName, other.BorgName, other.FlavorText, other.Species, : this(other.Name, other.ClownName, other.MimeName, other.BorgName, other.FlavorText, other.Species,
other.Voice, other.Age, other.Sex, other.Gender, other.BodyType, other.Appearance, other.Clothing, other.Voice, other.Age, other.Sex, other.Gender, other.BodyType, other.Appearance, other.Clothing,
other.Backpack, other.SpawnPriority, other.Backpack, other.SpawnPriority,
jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences) jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences, roleplayInfoData)
{ {
} }
/// <summary>Copy constructor</summary> /// <summary>Copy constructor</summary>
private HumanoidCharacterProfile(HumanoidCharacterProfile other) private HumanoidCharacterProfile(HumanoidCharacterProfile other)
: this(other, new Dictionary<string, JobPriority>(other.JobPriorities), : this(other, new Dictionary<string, JobPriority>(other.JobPriorities),
new List<string>(other.AntagPreferences), new List<string>(other.TraitPreferences)) new List<string>(other.AntagPreferences), new List<string>(other.TraitPreferences), new Dictionary<string,RoleplayInfo>(other.RoleplayInfoData))
{ {
} }
@@ -111,10 +115,11 @@ namespace Content.Shared.Preferences
IReadOnlyDictionary<string, JobPriority> jobPriorities, IReadOnlyDictionary<string, JobPriority> jobPriorities,
PreferenceUnavailableMode preferenceUnavailable, PreferenceUnavailableMode preferenceUnavailable,
IReadOnlyList<string> antagPreferences, IReadOnlyList<string> antagPreferences,
IReadOnlyList<string> traitPreferences) IReadOnlyList<string> traitPreferences,
IReadOnlyDictionary<string,RoleplayInfo> roleplayInfoData)
: this(name, clownName, mimeName, borgName, flavortext, species, age, sex, voice, gender, bodyType, : this(name, clownName, mimeName, borgName, flavortext, species, age, sex, voice, gender, bodyType,
appearance, clothing, backpack, spawnPriority, new Dictionary<string, JobPriority>(jobPriorities), appearance, clothing, backpack, spawnPriority, new Dictionary<string, JobPriority>(jobPriorities),
preferenceUnavailable, new List<string>(antagPreferences), new List<string>(traitPreferences)) preferenceUnavailable, new List<string>(antagPreferences), new List<string>(traitPreferences), new Dictionary<string, RoleplayInfo>(roleplayInfoData))
{ {
} }
@@ -145,7 +150,8 @@ namespace Content.Shared.Preferences
}, },
PreferenceUnavailableMode.SpawnAsOverflow, PreferenceUnavailableMode.SpawnAsOverflow,
new List<string>(), new List<string>(),
new List<string>()) new List<string>(),
new Dictionary<string, RoleplayInfo>())
{ {
} }
@@ -179,7 +185,8 @@ namespace Content.Shared.Preferences
}, },
PreferenceUnavailableMode.SpawnAsOverflow, PreferenceUnavailableMode.SpawnAsOverflow,
new List<string>(), new List<string>(),
new List<string>()); new List<string>(),
new Dictionary<string, RoleplayInfo>());
} }
// TODO: This should eventually not be a visual change only. // TODO: This should eventually not be a visual change only.
@@ -243,7 +250,7 @@ namespace Content.Shared.Preferences
new Dictionary<string, JobPriority> new Dictionary<string, JobPriority>
{ {
{ SharedGameTicker.FallbackOverflowJob, JobPriority.High }, { SharedGameTicker.FallbackOverflowJob, JobPriority.High },
}, PreferenceUnavailableMode.StayInLobby, new List<string>(), new List<string>()); }, PreferenceUnavailableMode.StayInLobby, new List<string>(), new List<string>(), new Dictionary<string, RoleplayInfo>());
} }
public string Name { get; private set; } public string Name { get; private set; }
@@ -289,6 +296,8 @@ namespace Content.Shared.Preferences
public IReadOnlyList<string> TraitPreferences => _traitPreferences; public IReadOnlyList<string> TraitPreferences => _traitPreferences;
public IReadOnlyDictionary<string,RoleplayInfo> RoleplayInfoData => _roleplayInfoData; //AMOUR
public PreferenceUnavailableMode PreferenceUnavailable { get; private set; } public PreferenceUnavailableMode PreferenceUnavailable { get; private set; }
public HumanoidCharacterProfile WithVoice(string voice) public HumanoidCharacterProfile WithVoice(string voice)
@@ -368,7 +377,7 @@ namespace Content.Shared.Preferences
public HumanoidCharacterProfile WithJobPriorities(IEnumerable<KeyValuePair<string, JobPriority>> jobPriorities) public HumanoidCharacterProfile WithJobPriorities(IEnumerable<KeyValuePair<string, JobPriority>> jobPriorities)
{ {
return new(this, new Dictionary<string, JobPriority>(jobPriorities), _antagPreferences, _traitPreferences); return new(this, new Dictionary<string, JobPriority>(jobPriorities), _antagPreferences, _traitPreferences,_roleplayInfoData);
} }
public HumanoidCharacterProfile WithJobPriority(string jobId, JobPriority priority) public HumanoidCharacterProfile WithJobPriority(string jobId, JobPriority priority)
@@ -383,7 +392,7 @@ namespace Content.Shared.Preferences
dictionary[jobId] = priority; dictionary[jobId] = priority;
} }
return new(this, dictionary, _antagPreferences, _traitPreferences); return new(this, dictionary, _antagPreferences, _traitPreferences, _roleplayInfoData);
} }
public HumanoidCharacterProfile WithPreferenceUnavailable(PreferenceUnavailableMode mode) public HumanoidCharacterProfile WithPreferenceUnavailable(PreferenceUnavailableMode mode)
@@ -393,7 +402,7 @@ namespace Content.Shared.Preferences
public HumanoidCharacterProfile WithAntagPreferences(IEnumerable<string> antagPreferences) public HumanoidCharacterProfile WithAntagPreferences(IEnumerable<string> antagPreferences)
{ {
return new(this, _jobPriorities, new List<string>(antagPreferences), _traitPreferences); return new(this, _jobPriorities, new List<string>(antagPreferences), _traitPreferences, _roleplayInfoData);
} }
public HumanoidCharacterProfile WithAntagPreference(string antagId, bool pref) public HumanoidCharacterProfile WithAntagPreference(string antagId, bool pref)
@@ -414,7 +423,7 @@ namespace Content.Shared.Preferences
} }
} }
return new(this, _jobPriorities, list, _traitPreferences); return new(this, _jobPriorities, list, _traitPreferences, _roleplayInfoData);
} }
public HumanoidCharacterProfile WithTraitPreference(string traitId, bool pref) public HumanoidCharacterProfile WithTraitPreference(string traitId, bool pref)
@@ -437,7 +446,20 @@ namespace Content.Shared.Preferences
} }
} }
return new(this, _jobPriorities, _antagPreferences, list); return new(this, _jobPriorities, _antagPreferences, list, _roleplayInfoData);
}
public HumanoidCharacterProfile WithRoleplaySelection(string name, RoleplaySelection selection)
{
var dict = new Dictionary<string,RoleplayInfo>(_roleplayInfoData);
if (dict.TryGetValue(name, out var a))
dict[name].RoleplaySelection = selection;
else
dict.Add(name, new RoleplayInfo(name,selection));
return new HumanoidCharacterProfile(this, _jobPriorities, _antagPreferences, _traitPreferences, dict);
} }
public string Summary => public string Summary =>

View File

@@ -0,0 +1,14 @@
namespace Content.Shared._Amour.CustomHeight;
[RegisterComponent]
public sealed partial class CustomHeightComponent : Component
{
[DataField]
public float Min = 0.89f;
[DataField]
public float Max = 1.1f;
[DataField]
public float Starting = 1f;
[DataField]
public bool Random = true;
}

View File

@@ -0,0 +1,79 @@
using Content.Shared._Amour.HumanoidAppearanceExtension;
using Content.Shared.Humanoid;
using Robust.Shared.Random;
using Robust.Shared.Serialization;
namespace Content.Shared._Amour.CustomHeight;
public abstract class SharedCustomHeightSystem : EntitySystem
{
[Dependency] protected readonly SharedAppearanceSystem AppearanceSystem = default!;
[Dependency] private readonly IRobustRandom _robustRandom = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CustomHeightComponent,ComponentInit>(OnInit);
SubscribeLocalEvent<CustomHeightComponent,HumanoidAppearanceLoadedEvent>(OnLoaded);
}
private void OnLoaded(EntityUid uid, CustomHeightComponent component, HumanoidAppearanceLoadedEvent args)
{
SetHeight(uid,GetHeightFromByte(uid,args.Profile.Appearance.Height));
}
private void OnInit(EntityUid uid, CustomHeightComponent component, ComponentInit args)
{
if(HasComp<HumanoidAppearanceComponent>(uid))
return;
if (component.Random)
component.Starting = _robustRandom.NextFloat(component.Min, component.Max);
if(component.Starting == 1f)
return;
SetHeight(uid,component.Starting);
}
public void SetHeight(Entity<CustomHeightComponent?> entity, float height)
{
if (!Resolve(entity, ref entity.Comp))
entity.Comp = EnsureComp<CustomHeightComponent>(entity);
height = Math.Clamp(height, entity.Comp.Min, entity.Comp.Max);
AppearanceSystem.SetData(entity,HeightVisuals.State, height);
}
public float GetHeightFromByte(Entity<CustomHeightComponent?> entity, byte per)
{
if (!Resolve(entity, ref entity.Comp))
entity.Comp = EnsureComp<CustomHeightComponent>(entity);
var percent = (float)per / byte.MaxValue;
var min = entity.Comp.Min;
var max = entity.Comp.Max;
return min + (max - min) * percent;
}
public byte GetByteFromHeight(Entity<CustomHeightComponent?> entity,float? varheight = null)
{
if (!Resolve(entity, ref entity.Comp))
entity.Comp = EnsureComp<CustomHeightComponent>(entity);
var min = entity.Comp.Min;
var max = entity.Comp.Max;
varheight ??= AppearanceSystem.TryGetData<float>(entity, HeightVisuals.State, out var height) ? height : min;
return (byte) ((varheight.Value - min) / (max - min) * byte.MaxValue);
}
}
[Serializable, NetSerializable]
public enum HeightVisuals : byte
{
State
}

View File

@@ -18,7 +18,19 @@ public sealed partial class RequireAnimation : IInteractionAction
{ {
var animationSystem = entityManager.System<SharedAnimationSystem>(); var animationSystem = entityManager.System<SharedAnimationSystem>();
var rotation = (entityManager.GetComponent<TransformComponent>(target).LocalPosition - entityManager.GetComponent<TransformComponent>(uid).LocalPosition)*0.5f; var targetTransform = entityManager.GetComponent<TransformComponent>(target);
var userTransform = entityManager.GetComponent<TransformComponent>(uid);
var targetPos = targetTransform.LocalPosition;
if (!targetTransform.ParentUid.Equals(targetTransform.GridUid))
targetPos = entityManager.GetComponent<TransformComponent>(targetTransform.ParentUid).LocalPosition;
var userPos = userTransform.LocalPosition;
if (!userTransform.ParentUid.Equals(userTransform.GridUid))
userPos = entityManager.GetComponent<TransformComponent>(userTransform.ParentUid).LocalPosition;
var rotation = (targetPos - userPos)*0.5f;
if (Length == 0) if (Length == 0)
{ {

View File

@@ -0,0 +1,19 @@
namespace Content.Shared._Amour.LoggerExtension;
public static class LoggerExt
{
public static void Trace(this ISawmill logger, params (string,object)[] objects)
{
if(objects.Length == 0)
return;
var text = "TRC: ";
foreach (var (name,obj) in objects)
{
text += $"{name}: {obj} ";
}
logger.Debug(text);
}
}

View File

@@ -0,0 +1,7 @@
namespace Content.Shared._Amour.RoleplayInfo;
[RegisterComponent]
public sealed partial class RoleplayInfoComponent : Component
{
[DataField] public List<RoleplayInfo> Data = new();
}

View File

@@ -0,0 +1,22 @@
using Robust.Shared.Serialization;
namespace Content.Shared._Amour.RoleplayInfo;
[Serializable, NetSerializable, DataDefinition]
public sealed partial class RoleplayInfo
{
[DataField] public string Name ;
[DataField] public RoleplaySelection RoleplaySelection;
public RoleplayInfo(string name, RoleplaySelection roleplaySelection)
{
Name = name;
RoleplaySelection = roleplaySelection;
}
}
public enum RoleplaySelection
{
No = 0,
Maybe = 1,
Yes = 2
}

View File

@@ -0,0 +1,9 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._Amour.RoleplayInfo;
[Prototype]
public sealed class RoleplayInfoPrototype : IPrototype
{
[IdDataField] public string ID { get; private set; } = default!;
}

View File

@@ -0,0 +1,19 @@
using System.Linq;
using Content.Shared._Amour.HumanoidAppearanceExtension;
using Content.Shared.Examine;
using Content.Shared.Humanoid;
namespace Content.Shared._Amour.RoleplayInfo;
public abstract class SharedRoleplaySystem : EntitySystem
{
public override void Initialize()
{
SubscribeLocalEvent<RoleplayInfoComponent, HumanoidAppearanceLoadingEvent>(OnHumanoidLoading);
}
private void OnHumanoidLoading(EntityUid uid, RoleplayInfoComponent component, HumanoidAppearanceLoadingEvent args)
{
component.Data = new List<RoleplayInfo>(args.Profile.RoleplayInfoData.Select(p => p.Value));
}
}

View File

@@ -0,0 +1,10 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._Amour.Sponsor;
[Prototype]
public sealed class SponsorItemPrototype : IPrototype
{
[IdDataField] public string ID { get; private set; } = default!;
[DataField] public List<string> Items = new();
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
roleplay-name-erp = ERP
roleplay-desc-erp = Хотите ли вы потрахушек?
roleplay-name-noncon = Non-Con
roleplay-desc-noncon = Хотите ли вы насильных потрахушек?
roleplay-no = Нет
roleplay-maybe = Уточнить
roleplay-yes = Да
roleplay-tab = Ролеплей
roleplay-info = Дополнительная информация:

View File

@@ -0,0 +1,3 @@
humanoid-profile-editor-height-label = Редактировать рост
height-reset = Сброс
humanoid-profile-height-current = Текущий рост:

View File

@@ -6,7 +6,7 @@ interaction-name-itemonbutt = засунуть вещь в очко
interaction-name-itemonvagina = засунуть вещь в вагину interaction-name-itemonvagina = засунуть вещь в вагину
interaction-name-itemfrombutt = засунуть руку в очко interaction-name-itemfrombutt = засунуть руку в очко
interaction-name-itemfromvagina = засунуть руку в вагину interaction-name-itemfromvagina = засунуть руку в вагину
interaction-name-lickdick = отлизать мужсокй половой орган interaction-name-lickdick = отлизать мужской половой орган
interaction-name-lickvagina = отлизать вагину interaction-name-lickvagina = отлизать вагину
interaction-name-lickface = отлизать лицо interaction-name-lickface = отлизать лицо
interaction-name-kissmouth = поцеловать в губы interaction-name-kissmouth = поцеловать в губы
@@ -64,6 +64,7 @@ interaction-sit-butt3 = вставляет в свой анал член и пр
interaction-sit-vagina1 = медленно садится своей киской прямо на член { $target } interaction-sit-vagina1 = медленно садится своей киской прямо на член { $target }
interaction-sit-vagina2 = вставляя в себя член, аккуратно опускается вагиной на орган { $target } interaction-sit-vagina2 = вставляя в себя член, аккуратно опускается вагиной на орган { $target }
interaction-sit-vagina3 = постепенно опустившись вниз, присаживается своей киской на член { $target } interaction-sit-vagina3 = постепенно опустившись вниз, присаживается своей киской на член { $target }
interaction-dick-lick1 = вобрав в свой ротик член, начинает посасывать орган { $target } interaction-dick-lick1 = вобрав в свой ротик член, начинает посасывать орган { $target }
interaction-dick-lick2 = приблизившись к половому органу своим ртом, просовывает тот внутрь себя и начинает массировать язычком член { $target } interaction-dick-lick2 = приблизившись к половому органу своим ртом, просовывает тот внутрь себя и начинает массировать язычком член { $target }
interaction-dick-lick3 = ласково облизав своим язычком член, начинает отсасывать у { $target } interaction-dick-lick3 = ласково облизав своим язычком член, начинает отсасывать у { $target }
@@ -101,7 +102,7 @@ interaction-ears-comb2 = с лаской чешет за ушком { $target }
interaction-ears-comb3 = заботливо почёсывает ушко { $target } interaction-ears-comb3 = заботливо почёсывает ушко { $target }
interaction-butt-comb1 = спустившись к булочкам, поглаживает { $target } interaction-butt-comb1 = спустившись к булочкам, поглаживает { $target }
interaction-butt-comb2 = мнёт и полаживает ягодицы { $target } interaction-butt-comb2 = мнёт и поглаживает ягодицы { $target }
interaction-butt-comb3 = проводя ладошкой по упругой попке, гладит { $target } interaction-butt-comb3 = проводя ладошкой по упругой попке, гладит { $target }
interaction-pull1 = робко схватил за ручки { $target } interaction-pull1 = робко схватил за ручки { $target }

View File

@@ -0,0 +1,45 @@
marking-SlimePersonEarsBasic = Обычные ушки
marking-SlimePersonEarsBasic-basic_outer = Внешняя часть уха
marking-SlimePersonEarsBasic-basic_inner = Внутренняя часть уха
marking-SlimePersonEarsCurled = Завитые ушки
marking-SlimePersonEarsCurled-curled_outer = Внешняя часть уха
marking-SlimePersonEarsCurled-curled_inner = Внутренняя часть уха
marking-SlimePersonEarsDroopy = Висячие ушки
marking-SlimePersonEarsDroopy-droopy_outer = Внешняя часть уха
marking-SlimePersonEarsDroopy-droopy_inner = Внутренняя часть уха
marking-SlimePersonEarsFuzzy = Пушистые ушки
marking-SlimePersonEarsFuzzy-basic_outer = Внешняя часть уха
marking-SlimePersonEarsFuzzy-fuzzy_inner = Пух
marking-SlimePersonEarsStubby = Stubby Ears
marking-SlimePersonEarsStubby-stubby_outer = Внешняя часть уха
marking-SlimePersonEarsStubby-stubby_inner = Внутренняя часть уха
marking-SlimePersonEarsTall = Высокие ушки
marking-SlimePersonEarsTall-tall_outer = Внешняя часть уха
marking-SlimePersonEarsTall-tall_inner = Внутренняя часть уха
marking-SlimePersonEarsTall-tall_fuzz = Пух
marking-SlimePersonEarsTorn = Порванные ушки
marking-SlimePersonEarsTorn-torn_outer = Внешняя часть уха
marking-SlimePersonEarsTorn-torn_inner = Внутренняя часть уха
marking-SlimePersonEarsWide = Широкие ушки
marking-SlimePersonEarsWide-wide_outer = Внешняя часть уха
marking-SlimePersonEarsWide-wide_inner = Внутренняя часть уха
marking-SlimePersonTailBasic = Обычный хвостик
marking-SlimePersonTailBasic-basic_tail_tip = Кончик
marking-SlimePersonTailBasic-basic_tail_stripes_even = Полосы, четные
marking-SlimePersonTailBasic-basic_tail_stripes_odd = Полосы, нечетные
marking-SlimePersonTailBasicWithBow = Хвостик с бантом
marking-SlimePersonTailBasicWithBow-basic_tail_tip = Кончик
marking-SlimePersonTailBasicWithBow-basic_tail_stripes_even = Полосы, четные
marking-SlimePersonTailBasicWithBow-basic_tail_stripes_odd = Полосы, нечетные
marking-SlimePersonTailBasicWithBow-basic_bow = Бант
marking-SlimePersonTailBasicWithBell = Хвостик с колокольчиком
marking-SlimePersonTailBasicWithBell-basic_tail_tip = Кончик
marking-SlimePersonTailBasicWithBell-basic_tail_stripes_even = Полосы, четные
marking-SlimePersonTailBasicWithBell-basic_tail_stripes_odd = Полосы, нечетные
marking-SlimePersonTailBasicWithBell-basic_bell = Колокольчик
marking-SlimePersonTailBasicWithBowAndBell = Хвостик с колокольчиком и бантиком
marking-SlimePersonTailBasicWithBowAndBell-basic_tail_tip = Кончик
marking-SlimePersonTailBasicWithBowAndBell-basic_tail_stripes_even = Полосы, четные
marking-SlimePersonTailBasicWithBowAndBell-basic_tail_stripes_odd = Полосы, нечетные
marking-SlimePersonTailBasicWithBowAndBell-basic_bow = Бант
marking-SlimePersonTailBasicWithBowAndBell-basic_bell = Колокольчик

View File

@@ -121,6 +121,9 @@
sprite: "Effects/creampie.rsi" sprite: "Effects/creampie.rsi"
state: "creampie_arachnid" state: "creampie_arachnid"
visible: false visible: false
- type: CustomHeight
min: 0.94
max: 1.2
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -130,5 +133,8 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: Arachnid species: Arachnid
bodyType: ArachnidNormal bodyType: ArachnidNormal
- type: CustomHeight
min: 0.94
max: 1.2
#88w88 #88w88

View File

@@ -51,6 +51,13 @@
- map: [ "id" ] - map: [ "id" ]
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.Hair" ] - map: [ "enum.HumanoidVisualLayers.Hair" ]
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
@@ -69,13 +76,6 @@
sprite: "Effects/creampie.rsi" sprite: "Effects/creampie.rsi"
state: "creampie_human" state: "creampie_human"
visible: false visible: false
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- type: DamageVisuals - type: DamageVisuals
thresholds: [ 10, 20, 30, 50, 70, 100 ] thresholds: [ 10, 20, 30, 50, 70, 100 ]
targetLayers: targetLayers:
@@ -272,6 +272,7 @@
- type: Crawlable - type: Crawlable
- type: InteractionPanel - type: InteractionPanel
actionListPrototype: Humanoid actionListPrototype: Humanoid
- type: RoleplayInfo
- type: entity - type: entity
save: false save: false
@@ -415,6 +416,13 @@
- map: [ "id" ] - map: [ "id" ]
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.Hair" ] - map: [ "enum.HumanoidVisualLayers.Hair" ]
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
@@ -424,13 +432,6 @@
- map: [ "head" ] - map: [ "head" ]
- map: [ "pocket1" ] - map: [ "pocket1" ]
- map: [ "pocket2" ] - map: [ "pocket2" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- type: Appearance - type: Appearance
- type: HumanoidAppearance - type: HumanoidAppearance
species: Human species: Human

View File

@@ -17,6 +17,7 @@
amount: 5 amount: 5
- type: HoleContainer - type: HoleContainer
useHumanGenitalLayers: true useHumanGenitalLayers: true
- type: CustomHeight
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -25,3 +26,4 @@
components: components:
- type: HoleContainer - type: HoleContainer
useHumanGenitalLayers: true useHumanGenitalLayers: true
- type: CustomHeight

View File

@@ -133,6 +133,7 @@
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ] - map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ] - map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT # END AMOUR EDIT
- type: CustomHeight
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -142,3 +143,4 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: Moth species: Moth
bodyType: MothNormal bodyType: MothNormal
- type: CustomHeight

View File

@@ -59,6 +59,9 @@
types: types:
Heat : 1.5 #per second, scales with temperature & other constants Heat : 1.5 #per second, scales with temperature & other constants
- type: Wagging - type: Wagging
- type: CustomHeight
min: 0.94
max: 1.2
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -69,5 +72,8 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: Reptilian species: Reptilian
bodyType: ReptilianNormal bodyType: ReptilianNormal
- type: CustomHeight
min: 0.94
max: 1.2
#Weh #Weh

View File

@@ -27,6 +27,7 @@
heatDamage: heatDamage:
types: types:
Heat : 1.5 #per second, scales with temperature & other constants Heat : 1.5 #per second, scales with temperature & other constants
- type: CustomHeight
- type: entity - type: entity
save: false save: false
@@ -39,3 +40,4 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: Skrell species: Skrell
bodyType: SkrellNormal bodyType: SkrellNormal
- type: CustomHeight

View File

@@ -69,6 +69,9 @@
types: types:
Asphyxiation: -1.0 Asphyxiation: -1.0
maxSaturation: 15 maxSaturation: 15
- type: CustomHeight
min: 0.8
max: 1.2
- type: entity - type: entity
parent: MobHumanDummy parent: MobHumanDummy
@@ -78,3 +81,6 @@
- type: HumanoidAppearance - type: HumanoidAppearance
species: SlimePerson species: SlimePerson
bodyType: SlimeNormal bodyType: SlimeNormal
- type: CustomHeight
min: 0.8
max: 1.2

View File

@@ -23,7 +23,6 @@
supervisors: job-supervisors-centcom supervisors: job-supervisors-centcom
whitelistedSpecies: whitelistedSpecies:
- Human - Human
- Felinid
canBeAntag: false canBeAntag: false
accessGroups: accessGroups:
- AllAccess - AllAccess

View File

@@ -96,7 +96,7 @@
id: FelinidTailBasic id: FelinidTailBasic
bodyPart: Tail bodyPart: Tail
markingCategory: Tail markingCategory: Tail
speciesRestriction: [Felinid] speciesRestriction: [Felinid, Tajaran]
sprites: sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi - sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip state: basic_tail_tip
@@ -109,7 +109,7 @@
id: FelinidTailBasicWithBow id: FelinidTailBasicWithBow
bodyPart: Tail bodyPart: Tail
markingCategory: Tail markingCategory: Tail
speciesRestriction: [Felinid] speciesRestriction: [Felinid, Tajaran]
sprites: sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi - sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip state: basic_tail_tip
@@ -124,7 +124,7 @@
id: FelinidTailBasicWithBell id: FelinidTailBasicWithBell
bodyPart: Tail bodyPart: Tail
markingCategory: Tail markingCategory: Tail
speciesRestriction: [Felinid] speciesRestriction: [Felinid, Tajaran]
sprites: sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi - sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip state: basic_tail_tip
@@ -139,7 +139,7 @@
id: FelinidTailBasicWithBowAndBell id: FelinidTailBasicWithBowAndBell
bodyPart: Tail bodyPart: Tail
markingCategory: Tail markingCategory: Tail
speciesRestriction: [Felinid] speciesRestriction: [Felinid, Tajaran]
sprites: sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi - sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip state: basic_tail_tip

View File

@@ -0,0 +1,163 @@
- type: marking
id: SlimePersonEarsBasic
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_inner
- type: marking
id: SlimePersonEarsCurled
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: curled_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: curled_inner
- type: marking
id: SlimePersonEarsDroopy
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: droopy_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: droopy_inner
- type: marking
id: SlimePersonEarsFuzzy
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: fuzzy_inner
- type: marking
id: SlimePersonEarsStubby
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: stubby_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: stubby_inner
- type: marking
id: SlimePersonEarsTall
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_inner
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_fuzz
- type: marking
id: SlimePersonEarsTorn
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: torn_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: torn_inner
- type: marking
id: SlimePersonEarsWide
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: wide_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: wide_inner
# Tails
- type: marking
id: SlimePersonTailBasic
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- type: marking
id: SlimePersonTailBasicWithBow
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bow
- type: marking
id: SlimePersonTailBasicWithBell
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bell
- type: marking
id: SlimePersonTailBasicWithBowAndBell
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [SlimePerson]
layerAlpha: 0.5
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bow
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bell

View File

@@ -89,6 +89,13 @@
- map: [ "belt" ] - map: [ "belt" ]
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
state: shaved state: shaved
sprite: Mobs/Customization/human_facial_hair.rsi sprite: Mobs/Customization/human_facial_hair.rsi
@@ -107,13 +114,6 @@
sprite: Mobs/Customization/masking_helpers.rsi sprite: Mobs/Customization/masking_helpers.rsi
state: none state: none
visible: false visible: false
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- type: HumanoidAppearance - type: HumanoidAppearance
species: Felinid species: Felinid
- type: Body - type: Body
@@ -140,6 +140,10 @@
- type: Stamina - type: Stamina
excess: 85 excess: 85
- type: Perishable - type: Perishable
- type: CustomHeight
min: 0.74
max: 0.85
starting: 0.8
- type: entity - type: entity
save: false save: false
@@ -232,6 +236,13 @@
- map: ["belt"] - map: ["belt"]
- map: ["neck"] - map: ["neck"]
- map: ["back"] - map: ["back"]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: ["enum.HumanoidVisualLayers.FacialHair"] - map: ["enum.HumanoidVisualLayers.FacialHair"]
state: shaved state: shaved
sprite: Mobs/Customization/human_facial_hair.rsi sprite: Mobs/Customization/human_facial_hair.rsi
@@ -252,12 +263,9 @@
sprite: Mobs/Customization/masking_helpers.rsi sprite: Mobs/Customization/masking_helpers.rsi
state: none state: none
visible: false visible: false
# START AMOUR EDIT - type: CustomHeight
- map: [ "enum.GenitalVisualLayers.ButtFront" ] min: 0.74
- map: [ "enum.GenitalVisualLayers.BreastFront" ] max: 0.85
- map: [ "enum.GenitalVisualLayers.VaginaFront" ] starting: 0.8
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
#Nya~~ #Nya~~

View File

@@ -85,6 +85,13 @@
- map: [ "belt" ] - map: [ "belt" ]
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
- map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "enum.HumanoidVisualLayers.Tail" ]
@@ -100,13 +107,6 @@
- map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "mask" ] - map: [ "mask" ]
- map: [ "head" ] - map: [ "head" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- type: HumanoidAppearance - type: HumanoidAppearance
species: Harpy species: Harpy
@@ -141,6 +141,7 @@
Male: SoundsHarpy Male: SoundsHarpy
Female: SoundsHarpy Female: SoundsHarpy
Unsexed: SoundsHarpy Unsexed: SoundsHarpy
- type: CustomHeight
- type: entity - type: entity
save: false save: false
@@ -191,6 +192,13 @@
- map: [ "belt" ] - map: [ "belt" ]
- map: [ "neck" ] - map: [ "neck" ]
- map: [ "back" ] - map: [ "back" ]
# START AMOUR EDIT
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ]
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadSide" ]
- map: [ "enum.HumanoidVisualLayers.Tail" ] - map: [ "enum.HumanoidVisualLayers.Tail" ]
@@ -206,13 +214,8 @@
- map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ]
- map: [ "mask" ] - map: [ "mask" ]
- map: [ "head" ] - map: [ "head" ]
# START AMOUR EDIT - type: CustomHeight
- map: [ "enum.GenitalVisualLayers.ButtFront" ]
- map: [ "enum.GenitalVisualLayers.BreastFront" ]
- map: [ "enum.GenitalVisualLayers.VaginaFront" ]
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
- map: [ "enum.GenitalVisualLayers.DickFront" ]
# END AMOUR EDIT
- type: entity - type: entity
id: ActionHarpyPlayMidi id: ActionHarpyPlayMidi

View File

@@ -38,9 +38,9 @@
speechSounds: Alto speechSounds: Alto
- type: Vocal - type: Vocal
sounds: sounds:
Male: MaleVulpkanin Male: MaleFelinid
Female: FemaleVulpkanin Female: FemaleFelinid
Unsexed: MaleVulpkanin Unsexed: MaleFelinid
- type: VulpAccent - type: VulpAccent
- type: Felinid #since this just adds an action... - type: Felinid #since this just adds an action...
- type: SelfHeal - type: SelfHeal
@@ -57,6 +57,7 @@
- outerClothing - outerClothing
healingSound: healingSound:
path: "/Audio/White/Felinid/lick.ogg" path: "/Audio/White/Felinid/lick.ogg"
- type: CustomHeight
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -65,3 +66,4 @@
components: components:
- type: HumanoidAppearance - type: HumanoidAppearance
species: Tajaran species: Tajaran
- type: CustomHeight

View File

@@ -57,6 +57,7 @@
- outerClothing - outerClothing
healingSound: healingSound:
path: "/Audio/White/Felinid/lick.ogg" path: "/Audio/White/Felinid/lick.ogg"
- type: CustomHeight
- type: entity - type: entity
parent: BaseSpeciesDummy parent: BaseSpeciesDummy
@@ -65,3 +66,4 @@
components: components:
- type: HumanoidAppearance - type: HumanoidAppearance
species: Vulpkanin species: Vulpkanin
- type: CustomHeight

View File

@@ -9,6 +9,8 @@
skinColoration: Hues skinColoration: Hues
bodyTypes: bodyTypes:
- TajaranNormal - TajaranNormal
sponsorOnly: true
forAmins: true
- type: markingPoints - type: markingPoints

View File

@@ -9,6 +9,8 @@
skinColoration: Hues skinColoration: Hues
bodyTypes: bodyTypes:
- VulpkaninNormal - VulpkaninNormal
sponsorOnly: true
forAmins: true
- type: markingPoints - type: markingPoints
id: MobVulpkaninMarkingLimits id: MobVulpkaninMarkingLimits

View File

@@ -0,0 +1,4 @@
- type: roleplayInfo
id: ERP
- type: roleplayInfo
id: NonCon

View File

@@ -0,0 +1,17 @@
- type: sponsorItem
id: 2 #prikolist
items:
- Tajaran
- Vulpkanin
- type: sponsorItem
id: 1 #mitior
items:
- Tajaran
- Vulpkanin
- type: sponsorItem
id: 5 #DJ EBAN
items:
- Tajaran
- Vulpkanin

View File

@@ -61,6 +61,8 @@
Hair: MobSlimeMarkingFollowSkin Hair: MobSlimeMarkingFollowSkin
FacialHair: MobSlimeMarkingFollowSkin FacialHair: MobSlimeMarkingFollowSkin
Chest: MobSlimeTorso Chest: MobSlimeTorso
HeadTop: MobHumanoidAnyMarking
Tail: MobHumanoidAnyMarking
Eyes: MobHumanoidEyes Eyes: MobHumanoidEyes
LArm: MobSlimeLArm LArm: MobSlimeLArm
RArm: MobSlimeRArm RArm: MobSlimeRArm