* - fix: Genitals sprite shit and meow for tajaran

* - add: fart sound if kicked from server

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

* - fix: Fart on exit

* - add: roleplay think

* - fix: database shit and loc

* - add: ears for slime

* - fix: LOC interaction fix

* - add: height setting

* - fix: height for felinids

* - fix: nigga fix

* - fix: no bitches on captain

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -18,7 +18,19 @@ public sealed partial class RequireAnimation : IInteractionAction
{
var animationSystem = entityManager.System<SharedAnimationSystem>();
var 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)
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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