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
|
// 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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.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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
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")
|
.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");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
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")
|
.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");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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.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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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")]
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
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 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)
|
||||||
{
|
{
|
||||||
|
|||||||
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-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 }
|
||||||
|
|||||||
@@ -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"
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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: [ "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~~
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
skinColoration: Hues
|
skinColoration: Hues
|
||||||
bodyTypes:
|
bodyTypes:
|
||||||
- TajaranNormal
|
- TajaranNormal
|
||||||
|
sponsorOnly: true
|
||||||
|
forAmins: true
|
||||||
|
|
||||||
|
|
||||||
- type: markingPoints
|
- type: markingPoints
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
skinColoration: Hues
|
skinColoration: Hues
|
||||||
bodyTypes:
|
bodyTypes:
|
||||||
- VulpkaninNormal
|
- VulpkaninNormal
|
||||||
|
sponsorOnly: true
|
||||||
|
forAmins: true
|
||||||
|
|
||||||
- type: markingPoints
|
- type: markingPoints
|
||||||
id: MobVulpkaninMarkingLimits
|
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
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user