Fixes (#73)
* - 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:
@@ -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
|
||||
// and we need to check the index is correct.
|
||||
// So if that happens just default to white?
|
||||
// Alpha WD EDIT
|
||||
if (colors != null && j < colors.Count)
|
||||
{
|
||||
sprite.LayerSetColor(layerId, colors[j]);
|
||||
sprite.LayerSetColor(layerId, colors[j].WithAlpha(markingPrototype.LayerAlpha));
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite.LayerSetColor(layerId, Color.White);
|
||||
sprite.LayerSetColor(layerId, Color.White.WithAlpha(markingPrototype.LayerAlpha));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,6 +131,15 @@
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CSpawnPriorityButton" HorizontalAlignment="Right" />
|
||||
</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>
|
||||
<!-- Skin -->
|
||||
<BoxContainer Margin="10" HorizontalExpand="True" Orientation="Vertical">
|
||||
@@ -178,6 +187,12 @@
|
||||
<humanoid:MarkingPicker Name="CMarkings" IgnoreCategories="Hair,FacialHair" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Name="CRolePlayThinkTab" Orientation="Vertical" Margin="10">
|
||||
<!-- RolePlay sel -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CRolePlayThing" Orientation="Vertical"></BoxContainer>
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
</TabContainer>
|
||||
</BoxContainer>
|
||||
<!-- Right side -->
|
||||
|
||||
@@ -8,6 +8,7 @@ using Content.Client.Message;
|
||||
using Content.Client.Players.PlayTimeTracking;
|
||||
using Content.Client.Stylesheets;
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared._Amour.RoleplayInfo;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.GameTicking;
|
||||
@@ -85,6 +86,8 @@ namespace Content.Client.Preferences.UI
|
||||
//WD-EDIT
|
||||
private OptionButton _voiceButton => CVoiceButton;
|
||||
private Button _voicePlayButton => CVoicePlayButton;
|
||||
private BoxContainer _rolePlayThink => CRolePlayThing;
|
||||
private List<RolePlaySelector> _roleplaySelections = new();
|
||||
//WD-EDIT
|
||||
|
||||
private Slider _skinColor => CSkin;
|
||||
@@ -220,6 +223,10 @@ namespace Content.Client.Preferences.UI
|
||||
#region Genitals
|
||||
InitializeGenitals();
|
||||
#endregion
|
||||
|
||||
#region height
|
||||
InitializeHeight();
|
||||
#endregion
|
||||
//AMOUR END
|
||||
|
||||
#region Species
|
||||
@@ -242,6 +249,7 @@ namespace Content.Client.Preferences.UI
|
||||
SetSpecies(_speciesList[args.Id].ID);
|
||||
UpdateHairPickers();
|
||||
OnSkinColorOnValueChanged();
|
||||
UpdateHeightControl(); // AMOUR
|
||||
};
|
||||
|
||||
#endregion Species
|
||||
@@ -545,6 +553,27 @@ namespace Content.Client.Preferences.UI
|
||||
|
||||
#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
|
||||
|
||||
_previewRotateLeftButton.OnPressed += _ =>
|
||||
@@ -1286,6 +1315,8 @@ namespace Content.Client.Preferences.UI
|
||||
|
||||
//Amour edit
|
||||
UpdateGenitalsControls();
|
||||
UpdateRoleplayThink();
|
||||
UpdateHeightControl();
|
||||
//Amour edit
|
||||
|
||||
_preferenceUnavailableButton.SelectId((int) Profile.PreferenceUnavailable);
|
||||
@@ -1603,5 +1634,74 @@ namespace Content.Client.Preferences.UI
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
25
Content.Client/_Amour/CustomHeight/CustomHeightSystem.cs
Normal file
25
Content.Client/_Amour/CustomHeight/CustomHeightSystem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Content.Client/_Amour/Fart/FartSystem.cs
Normal file
31
Content.Client/_Amour/Fart/FartSystem.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Content.Server.Database;
|
||||
using Content.Shared._Amour.RoleplayInfo;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Preferences;
|
||||
@@ -12,6 +13,7 @@ using Robust.Shared.Log;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.UnitTesting;
|
||||
using RoleplayInfo = Content.Shared._Amour.RoleplayInfo.RoleplayInfo;
|
||||
|
||||
namespace Content.IntegrationTests.Tests.Preferences
|
||||
{
|
||||
@@ -55,7 +57,7 @@ namespace Content.IntegrationTests.Tests.Preferences
|
||||
"Shaved",
|
||||
Color.Aquamarine,
|
||||
Color.Azure,
|
||||
Color.Beige,
|
||||
Color.Beige,128,
|
||||
new (), new() //AMOUR
|
||||
),
|
||||
ClothingPreference.Jumpskirt,
|
||||
@@ -67,7 +69,8 @@ namespace Content.IntegrationTests.Tests.Preferences
|
||||
},
|
||||
PreferenceUnavailableMode.StayInLobby,
|
||||
new List<string> (),
|
||||
new List<string>()
|
||||
new List<string>(),
|
||||
new Dictionary<string, RoleplayInfo>() //AMOUR
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
1911
Content.Server.Database/Migrations/Postgres/20240308135051_RolePlayThink.Designer.cs
generated
Normal file
1911
Content.Server.Database/Migrations/Postgres/20240308135051_RolePlayThink.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
1912
Content.Server.Database/Migrations/Postgres/20240308170141_RPMigrationEblya.Designer.cs
generated
Normal file
1912
Content.Server.Database/Migrations/Postgres/20240308170141_RPMigrationEblya.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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" });
|
||||
}
|
||||
}
|
||||
}
|
||||
1916
Content.Server.Database/Migrations/Postgres/20240310093942_HeightPrikoli.Designer.cs
generated
Normal file
1916
Content.Server.Database/Migrations/Postgres/20240310093942_HeightPrikoli.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -852,6 +852,10 @@ namespace Content.Server.Database.Migrations.Postgres
|
||||
.HasColumnType("text")
|
||||
.HasColumnName("hair_name");
|
||||
|
||||
b.Property<byte>("Height")
|
||||
.HasColumnType("smallint")
|
||||
.HasColumnName("height");
|
||||
|
||||
b.Property<JsonDocument>("Markings")
|
||||
.HasColumnType("jsonb")
|
||||
.HasColumnName("markings");
|
||||
@@ -909,6 +913,37 @@ namespace Content.Server.Database.Migrations.Postgres
|
||||
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 =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -1618,6 +1653,18 @@ namespace Content.Server.Database.Migrations.Postgres
|
||||
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 =>
|
||||
{
|
||||
b.HasOne("Content.Server.Database.Server", "Server")
|
||||
@@ -1832,6 +1879,8 @@ namespace Content.Server.Database.Migrations.Postgres
|
||||
|
||||
b.Navigation("Jobs");
|
||||
|
||||
b.Navigation("RoleplayInfo");
|
||||
|
||||
b.Navigation("Traits");
|
||||
});
|
||||
|
||||
|
||||
1836
Content.Server.Database/Migrations/Sqlite/20240308135003_RolePlayThink.Designer.cs
generated
Normal file
1836
Content.Server.Database/Migrations/Sqlite/20240308135003_RolePlayThink.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
1837
Content.Server.Database/Migrations/Sqlite/20240308170111_RPMigrationEblya.Designer.cs
generated
Normal file
1837
Content.Server.Database/Migrations/Sqlite/20240308170111_RPMigrationEblya.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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" });
|
||||
}
|
||||
}
|
||||
}
|
||||
1841
Content.Server.Database/Migrations/Sqlite/20240310093818_HeightPrikoli.Designer.cs
generated
Normal file
1841
Content.Server.Database/Migrations/Sqlite/20240310093818_HeightPrikoli.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -801,6 +801,10 @@ namespace Content.Server.Database.Migrations.Sqlite
|
||||
.HasColumnType("TEXT")
|
||||
.HasColumnName("hair_name");
|
||||
|
||||
b.Property<byte>("Height")
|
||||
.HasColumnType("INTEGER")
|
||||
.HasColumnName("height");
|
||||
|
||||
b.Property<byte[]>("Markings")
|
||||
.HasColumnType("jsonb")
|
||||
.HasColumnName("markings");
|
||||
@@ -858,6 +862,35 @@ namespace Content.Server.Database.Migrations.Sqlite
|
||||
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 =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -1545,6 +1578,18 @@ namespace Content.Server.Database.Migrations.Sqlite
|
||||
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 =>
|
||||
{
|
||||
b.HasOne("Content.Server.Database.Server", "Server")
|
||||
@@ -1759,6 +1804,8 @@ namespace Content.Server.Database.Migrations.Sqlite
|
||||
|
||||
b.Navigation("Jobs");
|
||||
|
||||
b.Navigation("RoleplayInfo");
|
||||
|
||||
b.Navigation("Traits");
|
||||
});
|
||||
|
||||
|
||||
@@ -64,6 +64,10 @@ namespace Content.Server.Database
|
||||
.HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.GenitalPrototype })
|
||||
.IsUnique();
|
||||
|
||||
modelBuilder.Entity<RoleplayInfo>()
|
||||
.HasIndex(r => new { HumanoidProfileId = r.ProfileId, r.Name })
|
||||
.IsUnique();
|
||||
|
||||
modelBuilder.Entity<Job>()
|
||||
.HasIndex(j => j.ProfileId);
|
||||
|
||||
@@ -329,6 +333,15 @@ namespace Content.Server.Database
|
||||
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
|
||||
|
||||
public class Preference
|
||||
@@ -361,6 +374,7 @@ namespace Content.Server.Database
|
||||
//WD-EDIT
|
||||
public string BodyType { get; set; } = null!;
|
||||
public string Voice { get; set; } = null!;
|
||||
public byte Height { get; set; }
|
||||
//WD-EDIT
|
||||
|
||||
public string Species { get; set; } = null!;
|
||||
@@ -377,7 +391,8 @@ namespace Content.Server.Database
|
||||
public List<Job> Jobs { get; } = new();
|
||||
public List<Antag> Antags { 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; }
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using System.Threading.Tasks;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Administration.Managers;
|
||||
using Content.Shared._Amour.Hole;
|
||||
using Content.Shared._Amour.RoleplayInfo;
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Content.Shared.Database;
|
||||
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.Traits)
|
||||
.Include(p => p.Profiles).ThenInclude(h => h.Genitals)
|
||||
.Include(p => p.Profiles).ThenInclude(h => h.RoleplayInfo)
|
||||
.AsSingleQuery()
|
||||
.SingleOrDefaultAsync(p => p.UserId == userId.UserId);
|
||||
|
||||
@@ -92,6 +94,7 @@ namespace Content.Server.Database
|
||||
.Include(p => p.Antags)
|
||||
.Include(p => p.Traits)
|
||||
.Include(p => p.Genitals)
|
||||
.Include(p => p.RoleplayInfo)
|
||||
.AsSplitQuery()
|
||||
.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 antags = profile.Antags.Select(a => a.AntagName);
|
||||
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;
|
||||
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.EyeColor),
|
||||
Color.FromHex(profile.SkinColor),
|
||||
profile.Height, // AMOUR EDIT
|
||||
markings, genitals.ToList() // Amour edit
|
||||
),
|
||||
clothing,
|
||||
@@ -250,7 +258,8 @@ namespace Content.Server.Database
|
||||
jobs,
|
||||
(PreferenceUnavailableMode) profile.PreferenceUnavailable,
|
||||
antags.ToList(),
|
||||
traits.ToList()
|
||||
traits.ToList(),
|
||||
roleplayInfo
|
||||
);
|
||||
}
|
||||
|
||||
@@ -288,7 +297,7 @@ namespace Content.Server.Database
|
||||
profile.Slot = slot;
|
||||
profile.PreferenceUnavailable = (DbPreferenceUnavailableMode) humanoid.PreferenceUnavailable;
|
||||
profile.Voice = humanoid.Voice;
|
||||
|
||||
profile.Height = appearance.Height; // AMOUR
|
||||
profile.Jobs.Clear();
|
||||
profile.Jobs.AddRange(
|
||||
humanoid.JobPriorities
|
||||
@@ -316,6 +325,15 @@ namespace Content.Server.Database
|
||||
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;
|
||||
}
|
||||
#endregion
|
||||
|
||||
9
Content.Server/_Amour/CustomHeight/CustomHeightSystem.cs
Normal file
9
Content.Server/_Amour/CustomHeight/CustomHeightSystem.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using Content.Shared._Amour.CustomHeight;
|
||||
using Robust.Server.GameObjects;
|
||||
|
||||
namespace Content.Server._Amour.CustomHeight;
|
||||
|
||||
public sealed class CustomHeightSystem : SharedCustomHeightSystem
|
||||
{
|
||||
|
||||
}
|
||||
28
Content.Server/_Amour/RoleplayInfo/RoleplayInfoSystem.cs
Normal file
28
Content.Server/_Amour/RoleplayInfo/RoleplayInfoSystem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
25
Content.Server/_Amour/Sponsor/SponsorSystem.Amour.cs
Normal file
25
Content.Server/_Amour/Sponsor/SponsorSystem.Amour.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ using Content.Server.Popups;
|
||||
using Content.Server.Store.Components;
|
||||
using Content.Server.Store.Systems;
|
||||
using Content.Server._White.Sponsors;
|
||||
using Content.Server.Administration.Managers;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Humanoid;
|
||||
@@ -27,6 +28,7 @@ using Content.Shared._White.MeatyOre;
|
||||
using Content.Shared.Verbs;
|
||||
using Content.Shared._White;
|
||||
using Content.Shared._White.MeatyOre;
|
||||
using Content.Shared.Database;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Server.GameStates;
|
||||
@@ -52,6 +54,7 @@ public sealed class MeatyOreStoreSystem : EntitySystem
|
||||
[Dependency] private readonly MindSystem _mindSystem = default!;
|
||||
[Dependency] private readonly SharedJobSystem _jobSystem = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly IBanManager _banManager = default!;
|
||||
|
||||
|
||||
private HttpClient _httpClient = default!;
|
||||
@@ -105,7 +108,8 @@ public sealed class MeatyOreStoreSystem : EntitySystem
|
||||
Message = $"Цена - {MeatyOreCurrencyPrototype}:10",
|
||||
Act = () =>
|
||||
{
|
||||
TryAddRole(ev.User, ev.Target, store);
|
||||
//TryAddRole(ev.User, ev.Target, store);
|
||||
TryBanDolboeb(actorComponent.PlayerSession);
|
||||
},
|
||||
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)
|
||||
{
|
||||
var result = false;
|
||||
|
||||
@@ -16,6 +16,7 @@ public sealed class SponsorsManager
|
||||
{
|
||||
[Dependency] private readonly IServerNetManager _netMgr = default!;
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
|
||||
private readonly HttpClient _httpClient = new();
|
||||
|
||||
@@ -50,6 +51,10 @@ public sealed class SponsorsManager
|
||||
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");
|
||||
|
||||
_cachedSponsors[e.UserId] = info;
|
||||
@@ -90,3 +95,7 @@ public sealed class SponsorsManager
|
||||
return await response.Content.ReadFromJsonAsync<SponsorInfo>();
|
||||
}
|
||||
}
|
||||
|
||||
//AMOUR CLASS
|
||||
[ByRefEvent]
|
||||
public record struct SponsorInfoLoadEvent(SponsorInfo SponsorInfo);
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace Content.Shared.Humanoid
|
||||
Color facialHairColor,
|
||||
Color eyeColor,
|
||||
Color skinColor,
|
||||
byte height,
|
||||
List<Marking> markings, List<Genital> genitals)
|
||||
{
|
||||
HairStyleId = hairStyleId;
|
||||
@@ -29,6 +30,7 @@ namespace Content.Shared.Humanoid
|
||||
SkinColor = ClampColor(skinColor);
|
||||
Markings = markings;
|
||||
Genitals = genitals;
|
||||
Height = height;
|
||||
}
|
||||
|
||||
[DataField("hair")]
|
||||
@@ -53,49 +55,57 @@ namespace Content.Shared.Humanoid
|
||||
public List<Marking> Markings { get; private set; }
|
||||
|
||||
[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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings,
|
||||
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Height, Markings,
|
||||
genitals);
|
||||
}
|
||||
|
||||
public HumanoidCharacterAppearance WithHeight(byte height)
|
||||
{
|
||||
return new (HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, height, Markings,
|
||||
Genitals);
|
||||
}
|
||||
|
||||
public HumanoidCharacterAppearance(List<Genital> genitals) : this(
|
||||
HairStyles.DefaultHairStyle,
|
||||
Color.Black,
|
||||
@@ -103,6 +113,7 @@ namespace Content.Shared.Humanoid
|
||||
Color.Black,
|
||||
Color.Black,
|
||||
Humanoid.SkinColor.ValidHumanSkinTone,
|
||||
128,
|
||||
new List<Marking>(), genitals
|
||||
)
|
||||
{
|
||||
@@ -132,7 +143,7 @@ namespace Content.Shared.Humanoid
|
||||
HairStyles.DefaultFacialHairStyle,
|
||||
Color.Black,
|
||||
Color.Black,
|
||||
skinColor,
|
||||
skinColor,128,
|
||||
new (), new()
|
||||
);
|
||||
}
|
||||
@@ -195,8 +206,10 @@ namespace Content.Shared.Humanoid
|
||||
newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor);
|
||||
}
|
||||
|
||||
var height = random.NextByte(byte.MaxValue);
|
||||
|
||||
return new HumanoidCharacterAppearance(newHairStyle, newHairColor,
|
||||
newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new (), new());
|
||||
newFacialHairStyle, newHairColor, newEyeColor, newSkinColor,height, new (), new());
|
||||
|
||||
float RandomizeColor(float channel)
|
||||
{
|
||||
@@ -272,7 +285,7 @@ namespace Content.Shared.Humanoid
|
||||
facialHairStyleId,
|
||||
facialHairColor,
|
||||
eyeColor,
|
||||
skinColor,
|
||||
skinColor, appearance.Height,
|
||||
markingSet.GetForwardEnumerator().ToList(),genitals);
|
||||
}
|
||||
|
||||
@@ -296,7 +309,7 @@ namespace Content.Shared.Humanoid
|
||||
facialHairStyleId,
|
||||
facialHairColor,
|
||||
eyeColor,
|
||||
skinColor,
|
||||
skinColor, appearance.Height,
|
||||
markingSet.GetForwardEnumerator().ToList(), genitals);
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ namespace Content.Shared.Humanoid.Markings
|
||||
|
||||
// WD-EDIT
|
||||
[DataField("sponsorOnly")] public bool SponsorOnly;
|
||||
[DataField("layerAlpha")]
|
||||
public float LayerAlpha { get; private set; } = 1.0f;
|
||||
// WD-EDIT
|
||||
|
||||
[DataField("followSkinColor")]
|
||||
|
||||
@@ -5,7 +5,7 @@ public static class SkinColor
|
||||
public const float MaxTintedHuesSaturation = 0.1f;
|
||||
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));
|
||||
|
||||
@@ -144,7 +144,7 @@ public static class SkinColor
|
||||
/// This takes in a color, and returns a color guaranteed to be above MinHuesLightness
|
||||
/// </summary>
|
||||
/// <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)
|
||||
{
|
||||
var manipulatedColor = Color.ToHsv(color);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Content.Shared._Amour.RoleplayInfo;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Humanoid;
|
||||
@@ -24,11 +25,12 @@ namespace Content.Shared.Preferences
|
||||
public sealed partial class HumanoidCharacterProfile : ICharacterProfile
|
||||
{
|
||||
public const int MaxNameLength = 32;
|
||||
public const int MaxDescLength = 512;
|
||||
public const int MaxDescLength = 1024;
|
||||
|
||||
private readonly Dictionary<string, JobPriority> _jobPriorities;
|
||||
private readonly List<string> _antagPreferences;
|
||||
private readonly List<string> _traitPreferences;
|
||||
private readonly Dictionary<string,RoleplayInfo> _roleplayInfoData; //AMOUR
|
||||
|
||||
private HumanoidCharacterProfile(
|
||||
string name,
|
||||
@@ -49,7 +51,8 @@ namespace Content.Shared.Preferences
|
||||
Dictionary<string, JobPriority> jobPriorities,
|
||||
PreferenceUnavailableMode preferenceUnavailable,
|
||||
List<string> antagPreferences,
|
||||
List<string> traitPreferences)
|
||||
List<string> traitPreferences,
|
||||
Dictionary<string,RoleplayInfo> roleplayInfoData)
|
||||
{
|
||||
Name = name;
|
||||
ClownName = clownName;
|
||||
@@ -70,6 +73,7 @@ namespace Content.Shared.Preferences
|
||||
PreferenceUnavailable = preferenceUnavailable;
|
||||
_antagPreferences = antagPreferences;
|
||||
_traitPreferences = traitPreferences;
|
||||
_roleplayInfoData = roleplayInfoData;
|
||||
}
|
||||
|
||||
/// <summary>Copy constructor but with overridable references (to prevent useless copies)</summary>
|
||||
@@ -77,18 +81,18 @@ namespace Content.Shared.Preferences
|
||||
HumanoidCharacterProfile other,
|
||||
Dictionary<string, JobPriority> jobPriorities,
|
||||
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,
|
||||
other.Voice, other.Age, other.Sex, other.Gender, other.BodyType, other.Appearance, other.Clothing,
|
||||
other.Backpack, other.SpawnPriority,
|
||||
jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences)
|
||||
jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences, roleplayInfoData)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>Copy constructor</summary>
|
||||
private HumanoidCharacterProfile(HumanoidCharacterProfile other)
|
||||
: 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,
|
||||
PreferenceUnavailableMode preferenceUnavailable,
|
||||
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,
|
||||
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,
|
||||
new List<string>(),
|
||||
new List<string>())
|
||||
new List<string>(),
|
||||
new Dictionary<string, RoleplayInfo>())
|
||||
{
|
||||
}
|
||||
|
||||
@@ -179,7 +185,8 @@ namespace Content.Shared.Preferences
|
||||
},
|
||||
PreferenceUnavailableMode.SpawnAsOverflow,
|
||||
new List<string>(),
|
||||
new List<string>());
|
||||
new List<string>(),
|
||||
new Dictionary<string, RoleplayInfo>());
|
||||
}
|
||||
|
||||
// TODO: This should eventually not be a visual change only.
|
||||
@@ -243,7 +250,7 @@ namespace Content.Shared.Preferences
|
||||
new Dictionary<string, JobPriority>
|
||||
{
|
||||
{ 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; }
|
||||
@@ -289,6 +296,8 @@ namespace Content.Shared.Preferences
|
||||
|
||||
public IReadOnlyList<string> TraitPreferences => _traitPreferences;
|
||||
|
||||
public IReadOnlyDictionary<string,RoleplayInfo> RoleplayInfoData => _roleplayInfoData; //AMOUR
|
||||
|
||||
public PreferenceUnavailableMode PreferenceUnavailable { get; private set; }
|
||||
|
||||
public HumanoidCharacterProfile WithVoice(string voice)
|
||||
@@ -368,7 +377,7 @@ namespace Content.Shared.Preferences
|
||||
|
||||
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)
|
||||
@@ -383,7 +392,7 @@ namespace Content.Shared.Preferences
|
||||
dictionary[jobId] = priority;
|
||||
}
|
||||
|
||||
return new(this, dictionary, _antagPreferences, _traitPreferences);
|
||||
return new(this, dictionary, _antagPreferences, _traitPreferences, _roleplayInfoData);
|
||||
}
|
||||
|
||||
public HumanoidCharacterProfile WithPreferenceUnavailable(PreferenceUnavailableMode mode)
|
||||
@@ -393,7 +402,7 @@ namespace Content.Shared.Preferences
|
||||
|
||||
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)
|
||||
@@ -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)
|
||||
@@ -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 =>
|
||||
|
||||
14
Content.Shared/_Amour/CustomHeight/CustomHeightComponent.cs
Normal file
14
Content.Shared/_Amour/CustomHeight/CustomHeightComponent.cs
Normal 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;
|
||||
}
|
||||
79
Content.Shared/_Amour/CustomHeight/CustomHeightSystem.cs
Normal file
79
Content.Shared/_Amour/CustomHeight/CustomHeightSystem.cs
Normal 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
|
||||
}
|
||||
@@ -18,7 +18,19 @@ public sealed partial class RequireAnimation : IInteractionAction
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
||||
19
Content.Shared/_Amour/LoggerExtension/LoggerExt.cs
Normal file
19
Content.Shared/_Amour/LoggerExtension/LoggerExt.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Content.Shared._Amour.RoleplayInfo;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class RoleplayInfoComponent : Component
|
||||
{
|
||||
[DataField] public List<RoleplayInfo> Data = new();
|
||||
}
|
||||
22
Content.Shared/_Amour/RoleplayInfo/RoleplayInfoData.cs
Normal file
22
Content.Shared/_Amour/RoleplayInfo/RoleplayInfoData.cs
Normal 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
|
||||
}
|
||||
@@ -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!;
|
||||
}
|
||||
19
Content.Shared/_Amour/RoleplayInfo/SharedRoleplaySystem.cs
Normal file
19
Content.Shared/_Amour/RoleplayInfo/SharedRoleplaySystem.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
10
Content.Shared/_Amour/Sponsor/SponsorItemPrototype.cs
Normal file
10
Content.Shared/_Amour/Sponsor/SponsorItemPrototype.cs
Normal 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();
|
||||
}
|
||||
BIN
Resources/Audio/_Amour/fart-with-reverb.ogg
Normal file
BIN
Resources/Audio/_Amour/fart-with-reverb.ogg
Normal file
Binary file not shown.
11
Resources/Locale/ru-RU/_amour/Roleplay/info.ftl
Normal file
11
Resources/Locale/ru-RU/_amour/Roleplay/info.ftl
Normal 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 = Дополнительная информация:
|
||||
3
Resources/Locale/ru-RU/_amour/height.ftl
Normal file
3
Resources/Locale/ru-RU/_amour/height.ftl
Normal file
@@ -0,0 +1,3 @@
|
||||
humanoid-profile-editor-height-label = Редактировать рост
|
||||
height-reset = Сброс
|
||||
humanoid-profile-height-current = Текущий рост:
|
||||
@@ -6,7 +6,7 @@ interaction-name-itemonbutt = засунуть вещь в очко
|
||||
interaction-name-itemonvagina = засунуть вещь в вагину
|
||||
interaction-name-itemfrombutt = засунуть руку в очко
|
||||
interaction-name-itemfromvagina = засунуть руку в вагину
|
||||
interaction-name-lickdick = отлизать мужсокй половой орган
|
||||
interaction-name-lickdick = отлизать мужской половой орган
|
||||
interaction-name-lickvagina = отлизать вагину
|
||||
interaction-name-lickface = отлизать лицо
|
||||
interaction-name-kissmouth = поцеловать в губы
|
||||
@@ -64,6 +64,7 @@ interaction-sit-butt3 = вставляет в свой анал член и пр
|
||||
interaction-sit-vagina1 = медленно садится своей киской прямо на член { $target }
|
||||
interaction-sit-vagina2 = вставляя в себя член, аккуратно опускается вагиной на орган { $target }
|
||||
interaction-sit-vagina3 = постепенно опустившись вниз, присаживается своей киской на член { $target }
|
||||
|
||||
interaction-dick-lick1 = вобрав в свой ротик член, начинает посасывать орган { $target }
|
||||
interaction-dick-lick2 = приблизившись к половому органу своим ртом, просовывает тот внутрь себя и начинает массировать язычком член { $target }
|
||||
interaction-dick-lick3 = ласково облизав своим язычком член, начинает отсасывать у { $target }
|
||||
@@ -101,7 +102,7 @@ interaction-ears-comb2 = с лаской чешет за ушком { $target }
|
||||
interaction-ears-comb3 = заботливо почёсывает ушко { $target }
|
||||
|
||||
interaction-butt-comb1 = спустившись к булочкам, поглаживает { $target }
|
||||
interaction-butt-comb2 = мнёт и полаживает ягодицы { $target }
|
||||
interaction-butt-comb2 = мнёт и поглаживает ягодицы { $target }
|
||||
interaction-butt-comb3 = проводя ладошкой по упругой попке, гладит { $target }
|
||||
|
||||
interaction-pull1 = робко схватил за ручки { $target }
|
||||
|
||||
@@ -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 = Колокольчик
|
||||
@@ -121,6 +121,9 @@
|
||||
sprite: "Effects/creampie.rsi"
|
||||
state: "creampie_arachnid"
|
||||
visible: false
|
||||
- type: CustomHeight
|
||||
min: 0.94
|
||||
max: 1.2
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -130,5 +133,8 @@
|
||||
- type: HumanoidAppearance
|
||||
species: Arachnid
|
||||
bodyType: ArachnidNormal
|
||||
- type: CustomHeight
|
||||
min: 0.94
|
||||
max: 1.2
|
||||
|
||||
#88w88
|
||||
|
||||
@@ -51,6 +51,13 @@
|
||||
- map: [ "id" ]
|
||||
- map: [ "neck" ]
|
||||
- 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.Hair" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadSide" ]
|
||||
@@ -69,13 +76,6 @@
|
||||
sprite: "Effects/creampie.rsi"
|
||||
state: "creampie_human"
|
||||
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
|
||||
thresholds: [ 10, 20, 30, 50, 70, 100 ]
|
||||
targetLayers:
|
||||
@@ -272,6 +272,7 @@
|
||||
- type: Crawlable
|
||||
- type: InteractionPanel
|
||||
actionListPrototype: Humanoid
|
||||
- type: RoleplayInfo
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
@@ -415,6 +416,13 @@
|
||||
- map: [ "id" ]
|
||||
- map: [ "neck" ]
|
||||
- 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.Hair" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadSide" ]
|
||||
@@ -424,13 +432,6 @@
|
||||
- map: [ "head" ]
|
||||
- map: [ "pocket1" ]
|
||||
- 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: HumanoidAppearance
|
||||
species: Human
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
amount: 5
|
||||
- type: HoleContainer
|
||||
useHumanGenitalLayers: true
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -25,3 +26,4 @@
|
||||
components:
|
||||
- type: HoleContainer
|
||||
useHumanGenitalLayers: true
|
||||
- type: CustomHeight
|
||||
|
||||
@@ -133,6 +133,7 @@
|
||||
- map: [ "enum.GenitalVisualLayers.TesticlesFront" ]
|
||||
- map: [ "enum.GenitalVisualLayers.DickFront" ]
|
||||
# END AMOUR EDIT
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -142,3 +143,4 @@
|
||||
- type: HumanoidAppearance
|
||||
species: Moth
|
||||
bodyType: MothNormal
|
||||
- type: CustomHeight
|
||||
|
||||
@@ -59,6 +59,9 @@
|
||||
types:
|
||||
Heat : 1.5 #per second, scales with temperature & other constants
|
||||
- type: Wagging
|
||||
- type: CustomHeight
|
||||
min: 0.94
|
||||
max: 1.2
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -69,5 +72,8 @@
|
||||
- type: HumanoidAppearance
|
||||
species: Reptilian
|
||||
bodyType: ReptilianNormal
|
||||
- type: CustomHeight
|
||||
min: 0.94
|
||||
max: 1.2
|
||||
|
||||
#Weh
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
heatDamage:
|
||||
types:
|
||||
Heat : 1.5 #per second, scales with temperature & other constants
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
@@ -39,3 +40,4 @@
|
||||
- type: HumanoidAppearance
|
||||
species: Skrell
|
||||
bodyType: SkrellNormal
|
||||
- type: CustomHeight
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
types:
|
||||
Asphyxiation: -1.0
|
||||
maxSaturation: 15
|
||||
- type: CustomHeight
|
||||
min: 0.8
|
||||
max: 1.2
|
||||
|
||||
- type: entity
|
||||
parent: MobHumanDummy
|
||||
@@ -78,3 +81,6 @@
|
||||
- type: HumanoidAppearance
|
||||
species: SlimePerson
|
||||
bodyType: SlimeNormal
|
||||
- type: CustomHeight
|
||||
min: 0.8
|
||||
max: 1.2
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
supervisors: job-supervisors-centcom
|
||||
whitelistedSpecies:
|
||||
- Human
|
||||
- Felinid
|
||||
canBeAntag: false
|
||||
accessGroups:
|
||||
- AllAccess
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
id: FelinidTailBasic
|
||||
bodyPart: Tail
|
||||
markingCategory: Tail
|
||||
speciesRestriction: [Felinid]
|
||||
speciesRestriction: [Felinid, Tajaran]
|
||||
sprites:
|
||||
- sprite: White/Mobs/Customization/felinid_tails.rsi
|
||||
state: basic_tail_tip
|
||||
@@ -109,7 +109,7 @@
|
||||
id: FelinidTailBasicWithBow
|
||||
bodyPart: Tail
|
||||
markingCategory: Tail
|
||||
speciesRestriction: [Felinid]
|
||||
speciesRestriction: [Felinid, Tajaran]
|
||||
sprites:
|
||||
- sprite: White/Mobs/Customization/felinid_tails.rsi
|
||||
state: basic_tail_tip
|
||||
@@ -124,7 +124,7 @@
|
||||
id: FelinidTailBasicWithBell
|
||||
bodyPart: Tail
|
||||
markingCategory: Tail
|
||||
speciesRestriction: [Felinid]
|
||||
speciesRestriction: [Felinid, Tajaran]
|
||||
sprites:
|
||||
- sprite: White/Mobs/Customization/felinid_tails.rsi
|
||||
state: basic_tail_tip
|
||||
@@ -139,7 +139,7 @@
|
||||
id: FelinidTailBasicWithBowAndBell
|
||||
bodyPart: Tail
|
||||
markingCategory: Tail
|
||||
speciesRestriction: [Felinid]
|
||||
speciesRestriction: [Felinid, Tajaran]
|
||||
sprites:
|
||||
- sprite: White/Mobs/Customization/felinid_tails.rsi
|
||||
state: basic_tail_tip
|
||||
|
||||
163
Resources/Prototypes/White/Mobs/Customization/Markings/slime.yml
Normal file
163
Resources/Prototypes/White/Mobs/Customization/Markings/slime.yml
Normal 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
|
||||
@@ -89,6 +89,13 @@
|
||||
- map: [ "belt" ]
|
||||
- map: [ "neck" ]
|
||||
- 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" ]
|
||||
state: shaved
|
||||
sprite: Mobs/Customization/human_facial_hair.rsi
|
||||
@@ -107,13 +114,6 @@
|
||||
sprite: Mobs/Customization/masking_helpers.rsi
|
||||
state: none
|
||||
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
|
||||
species: Felinid
|
||||
- type: Body
|
||||
@@ -140,6 +140,10 @@
|
||||
- type: Stamina
|
||||
excess: 85
|
||||
- type: Perishable
|
||||
- type: CustomHeight
|
||||
min: 0.74
|
||||
max: 0.85
|
||||
starting: 0.8
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
@@ -232,6 +236,13 @@
|
||||
- map: ["belt"]
|
||||
- map: ["neck"]
|
||||
- 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"]
|
||||
state: shaved
|
||||
sprite: Mobs/Customization/human_facial_hair.rsi
|
||||
@@ -252,12 +263,9 @@
|
||||
sprite: Mobs/Customization/masking_helpers.rsi
|
||||
state: none
|
||||
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: CustomHeight
|
||||
min: 0.74
|
||||
max: 0.85
|
||||
starting: 0.8
|
||||
|
||||
#Nya~~
|
||||
|
||||
@@ -85,6 +85,13 @@
|
||||
- map: [ "belt" ]
|
||||
- map: [ "neck" ]
|
||||
- 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.HeadSide" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.Tail" ]
|
||||
@@ -100,13 +107,6 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadTop" ]
|
||||
- map: [ "mask" ]
|
||||
- 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
|
||||
species: Harpy
|
||||
@@ -141,6 +141,7 @@
|
||||
Male: SoundsHarpy
|
||||
Female: SoundsHarpy
|
||||
Unsexed: SoundsHarpy
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
@@ -191,6 +192,13 @@
|
||||
- map: [ "belt" ]
|
||||
- map: [ "neck" ]
|
||||
- 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.HeadSide" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.Tail" ]
|
||||
@@ -206,13 +214,8 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadTop" ]
|
||||
- map: [ "mask" ]
|
||||
- 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: CustomHeight
|
||||
|
||||
|
||||
- type: entity
|
||||
id: ActionHarpyPlayMidi
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
speechSounds: Alto
|
||||
- type: Vocal
|
||||
sounds:
|
||||
Male: MaleVulpkanin
|
||||
Female: FemaleVulpkanin
|
||||
Unsexed: MaleVulpkanin
|
||||
Male: MaleFelinid
|
||||
Female: FemaleFelinid
|
||||
Unsexed: MaleFelinid
|
||||
- type: VulpAccent
|
||||
- type: Felinid #since this just adds an action...
|
||||
- type: SelfHeal
|
||||
@@ -57,6 +57,7 @@
|
||||
- outerClothing
|
||||
healingSound:
|
||||
path: "/Audio/White/Felinid/lick.ogg"
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -65,3 +66,4 @@
|
||||
components:
|
||||
- type: HumanoidAppearance
|
||||
species: Tajaran
|
||||
- type: CustomHeight
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
- outerClothing
|
||||
healingSound:
|
||||
path: "/Audio/White/Felinid/lick.ogg"
|
||||
- type: CustomHeight
|
||||
|
||||
- type: entity
|
||||
parent: BaseSpeciesDummy
|
||||
@@ -65,3 +66,4 @@
|
||||
components:
|
||||
- type: HumanoidAppearance
|
||||
species: Vulpkanin
|
||||
- type: CustomHeight
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
skinColoration: Hues
|
||||
bodyTypes:
|
||||
- TajaranNormal
|
||||
sponsorOnly: true
|
||||
forAmins: true
|
||||
|
||||
|
||||
- type: markingPoints
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
skinColoration: Hues
|
||||
bodyTypes:
|
||||
- VulpkaninNormal
|
||||
sponsorOnly: true
|
||||
forAmins: true
|
||||
|
||||
- type: markingPoints
|
||||
id: MobVulpkaninMarkingLimits
|
||||
|
||||
4
Resources/Prototypes/_Amour/roleplay.yml
Normal file
4
Resources/Prototypes/_Amour/roleplay.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
- type: roleplayInfo
|
||||
id: ERP
|
||||
- type: roleplayInfo
|
||||
id: NonCon
|
||||
17
Resources/Prototypes/_Amour/sponsorItems.yml
Normal file
17
Resources/Prototypes/_Amour/sponsorItems.yml
Normal 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
|
||||
@@ -61,6 +61,8 @@
|
||||
Hair: MobSlimeMarkingFollowSkin
|
||||
FacialHair: MobSlimeMarkingFollowSkin
|
||||
Chest: MobSlimeTorso
|
||||
HeadTop: MobHumanoidAnyMarking
|
||||
Tail: MobHumanoidAnyMarking
|
||||
Eyes: MobHumanoidEyes
|
||||
LArm: MobSlimeLArm
|
||||
RArm: MobSlimeRArm
|
||||
|
||||
Reference in New Issue
Block a user