Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions Content.Client/Humanoid/HumanoidAppearanceSystem.cs

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

на двойные хвосты тоже жаловались игроки (У вульп, унатхов), черри пикнулся также фикс этого бага с корвакса

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ namespace Content.Client.Humanoid;

public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
{

private const string AnimatedMarkingSuffix = "Animated"; // Forge-Change
[Dependency] private IPrototypeManager _prototypeManager = default!;
[Dependency] private MarkingManager _markingManager = default!;

Expand Down Expand Up @@ -238,7 +240,7 @@ private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteCompon
{
foreach (var marking in markingList)
{
RemoveMarking(marking, sprite);
ClearMarking(marking, sprite); // Forge-Change: RemoveMarking > ClearMarking
}
}

Expand All @@ -248,26 +250,52 @@ private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteCompon
{
foreach (var marking in markingList)
{
RemoveMarking(marking, sprite);
ClearMarking(marking, sprite); // Forge-Change: RemoveMarking > ClearMarking
}
}
}

// Forge-Change-start: remove stale static/animated counterpart layers when refreshing markings.
private void ClearMarking(Marking marking, SpriteComponent spriteComp)
{
RemoveMarking(marking, spriteComp);
RemoveAnimatedCounterpart(marking, spriteComp);
}

private void RemoveAnimatedCounterpart(Marking marking, SpriteComponent spriteComp)
{
var markingId = marking.MarkingId;
var counterpartId = markingId.EndsWith(AnimatedMarkingSuffix, StringComparison.Ordinal)
? markingId[..^AnimatedMarkingSuffix.Length]
: $"{markingId}{AnimatedMarkingSuffix}";

if (!_prototypeManager.TryIndex<MarkingPrototype>(counterpartId, out var counterpart))
return;

RemoveMarking(counterpart, spriteComp);
}
// Forge-Change-end

private void RemoveMarking(Marking marking, SpriteComponent spriteComp)
{
if (!_markingManager.TryGetMarking(marking, out var prototype))
{
return;
}

RemoveMarking(prototype, spriteComp);
}
private void RemoveMarking(MarkingPrototype prototype, SpriteComponent spriteComp)
{ // Forge-Change
foreach (var sprite in prototype.Sprites)
{
if (sprite is not SpriteSpecifier.Rsi rsi)
{
continue;
}

var layerId = $"{marking.MarkingId}-{rsi.RsiState}";
var layerId = $"{prototype.ID}-{rsi.RsiState}"; // Forge-Change: marking.MarkingId > prototype.ID

if (!spriteComp.LayerMapTryGet(layerId, out var index))
{
continue;
Expand All @@ -277,6 +305,7 @@ private void RemoveMarking(Marking marking, SpriteComponent spriteComp)
spriteComp.RemoveLayer(index);
}
}

private void ApplyMarking(MarkingPrototype markingPrototype,
IReadOnlyList<Color>? colors,
bool visible,
Expand Down
9 changes: 9 additions & 0 deletions Content.Client/_Mono/FireControl/UI/FireControlWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@
<Button Name="RefreshButton" Access="Public" Text="{Loc admin-logs-refresh}"
StyleClasses="ButtonSquare" Margin="2 2 2 2"/>
</PanelContainer>
<!-- Forge-Change-Start -->
<PanelContainer VerticalExpand="False" HorizontalExpand="True">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BorderThickness="4" BorderColor="#2e2e2e" BackgroundColor="#1c1c1c" />
</PanelContainer.PanelOverride>
<CheckBox Name="ShowIFFCheckbox" Access="Public" Text="{Loc 'gunnery-show-iff'}"
Margin="4 2 2 2" Pressed="True"/>
</PanelContainer>
<!-- Forge-Change-End -->

<!-- Weapons Control Section -->
<controls:StripeBack MinSize="48 48" Margin="0 0 0 0">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public FireControlWindow()
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
RefreshButton.OnPressed += _ => OnServerRefresh?.Invoke();
ShowIFFCheckbox.OnToggled += args => NavRadar.ShowIFF = args.Pressed; // Forge-Change
SelectAllButton.OnPressed += SelectAllWeapons;
UnselectAllButton.OnPressed += UnselectAllWeapons;
SelectBallisticButton.OnPressed += SelectBallisticWeapons;
Expand Down
44 changes: 42 additions & 2 deletions Content.Server/Wagging/WaggingSystem.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Content.Server.Actions;
using Content.Server.Actions; // Forge-Change
using Content.Server.Humanoid;
using Content.Shared.Actions; // Forge-Change
using Content.Shared._Shitmed.Humanoid.Events; // Forge-Change
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Mobs;
Expand All @@ -26,11 +28,19 @@ public override void Initialize()
SubscribeLocalEvent<WaggingComponent, ComponentShutdown>(OnWaggingShutdown);
SubscribeLocalEvent<WaggingComponent, ToggleActionEvent>(OnWaggingToggle);
SubscribeLocalEvent<WaggingComponent, MobStateChangedEvent>(OnMobStateChanged);
SubscribeLocalEvent<WaggingComponent, ProfileLoadFinishedEvent>(OnProfileLoadFinished); // Forge-Change
}

private void OnWaggingMapInit(EntityUid uid, WaggingComponent component, MapInitEvent args)
{
_actions.AddAction(uid, ref component.ActionEntity, component.Action, uid);
// Forge-Change-start
UpdateWaggingAction(uid, component);
}

private void OnProfileLoadFinished(EntityUid uid, WaggingComponent component, ProfileLoadFinishedEvent args)
{
UpdateWaggingAction(uid, component);
Comment thread
fox76055 marked this conversation as resolved.
// Forge-Change-end
}

private void OnWaggingShutdown(EntityUid uid, WaggingComponent component, ComponentShutdown args)
Expand All @@ -52,6 +62,36 @@ private void OnMobStateChanged(EntityUid uid, WaggingComponent component, MobSta
TryToggleWagging(uid, wagging: component);
}

// Forge-Change-start: only provide wagging action when the entity has a tail marking.
private void UpdateWaggingAction(EntityUid uid, WaggingComponent component, HumanoidAppearanceComponent? humanoid = null)
{
if (!Resolve(uid, ref humanoid, false))
{
_actions.RemoveAction(uid, component.ActionEntity);
component.ActionEntity = null;
component.Wagging = false;
return;
}

var hasTail = humanoid.MarkingSet.Markings.TryGetValue(MarkingCategories.Tail, out var markings) &&
markings.Count > 0;

if (!hasTail)
{
_actions.RemoveAction(uid, component.ActionEntity);
component.ActionEntity = null;
component.Wagging = false;
return;
}

// The action container can still be uninitialized during profile load (e.g. integration map init spawn paths).
if (!TryComp<ActionsContainerComponent>(uid, out var actionContainer) || !actionContainer.Initialized)
return;

_actions.AddAction(uid, ref component.ActionEntity, component.Action, uid);
}
// Forge-Change-end

public bool TryToggleWagging(EntityUid uid, WaggingComponent? wagging = null, HumanoidAppearanceComponent? humanoid = null)
{
if (!Resolve(uid, ref wagging, ref humanoid))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ chat-language-Marish-name = Marish
chat-language-Chittin-name = Chittin
chat-language-Xeeplian-name = Xeeplian
chat-language-Hydraspeak-name = Hy'drav'tha
chat-language-Kelael-name = Kela'el
# Ported from Floofstation:
chat-language-NewKinPidgin-name = Ka'rakk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ language-Hydraspeak-description =
A Mix of warbles, trills and chirps, with heavy tonal shifts and pitch changes make up this unusual language.
Due to the avian nature of hydrakin, one word can mean a million other things at the same time, which makes this language next to incomprehensible for even other birdlike races to figure out.

language-Kelael-name = Kela'el
language-Kelael-description =
A refined infernal tongue spoken by Arkans.
Flowing vowels and gentle cadence make it sound like a haunting song to outsiders.

language-Nekomimetic-name = Nekomimetic
language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the Felinids and Oni, it's somehow comprehensible.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ trait-language-azaziba-desc =
A language of Moghes consisting of a combination of spoken word and gesticulation.
While waning since Moghes entered the galactic stage - it enjoys popular use by Unathi that never fell to the Hegemony's cultural dominance.
trait-language-kelael-name = Kela'el
trait-language-kelael-desc =
A refined infernal tongue with melodic cadence and flowing phonemes.
Spoken by Arkans and occasionally studied by linguists and occultists.
trait-language-SiikMaas-name = Siik'maas
trait-language-SiikMaas-desc =
The ancient religious tongue of the Tajara, now the most widely spoken and taught language on Adhomai.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
ent-OrganDemonStomach = { ent-OrganAnimalStomach }
.desc = { ent-OrganAnimalHeart.desc }
.suffix = { "Аркана" }
ent-OrganDemonHeart = сердце арканы
.desc = { ent-OrganAnimalHeart.desc }
.suffix = { "Аркана" }
reagent-name-demon-blood = кровь арканы
reagent-desc-demon-blood = Загадочная кровь, характерная для представителей расы суккубов. Обладает необычными регенеративными свойствами и ускоряет заживление тканей у большинства организмов. Однако у арканов вызывает обратную реакцию, разрушая внутренние связи и нанося урон.
metabolizer-type-demon = Аркана
22 changes: 22 additions & 0 deletions Resources/Locale/ru-RU/_ADT/prototypes/Body/Parts/demon.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
ent-PartDemon = часть тела арканы
.desc = { ent-BaseItem.desc }
ent-TorsoDemon = торс арканы
.desc = { ent-PartDemon.desc }
ent-HeadDemon = голова арканы
.desc = { ent-PartDemon.desc }
ent-LeftArmDemon = левая рука арканы
.desc = { ent-PartDemon.desc }
ent-RightArmDemon = правая рука арканы
.desc = { ent-PartDemon.desc }
ent-LeftHandDemon = левая кисть арканы
.desc = { ent-PartDemon.desc }
ent-RightHandDemon = правая кисть арканы
.desc = { ent-PartDemon.desc }
ent-LeftLegDemon = левая нога арканы
.desc = { ent-PartDemon.desc }
ent-RightLegDemon = правая нога арканы
.desc = { ent-PartDemon.desc }
ent-LeftFootDemon = левая стопа арканы
.desc = { ent-PartDemon.desc }
ent-RightFootDemon = правая стопа арканы
.desc = { ent-PartDemon.desc }
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Уши
marking-DemonCowEars = Аркана, уши (Коровьи)
marking-DemonCowEars-cow_ears = Уши
marking-DemonEars = Аркана, уши (Демонические)
marking-DemonEars-demon_ears = Уши
marking-DemonElfEars = Аркана, уши (Эльфийские)
marking-DemonElfEars-ears_elf = Уши

# Хвост
marking-DemomTail = Аркана, хвост
marking-DemomTail-tail = Хвост
marking-DemomTail1 = Аркана, хвост (Демонические)
marking-DemomTail1-demon_tail = Хвост
marking-DemomTailLong = Аркана, хвост (Длинный демонические)
marking-DemomTailLong-long = Хвост
marking-DemomTailUp = Аркана, хвост (Демонические вверх)
marking-DemomTailUp-up = Хвост
marking-DemomTailAnimated = Аркана, хвост (Анимированный)
marking-DemomTailAnimated-tail_waggin = Хвост
marking-DemomTail1Animated = Аркана, хвост (Демонический, анимированный)
marking-DemomTail1Animated-demon_tail_waggin = Хвост
marking-DemomTailLongAnimated = Аркана, хвост (Длинный, анимированный)
marking-DemomTailLongAnimated-long_waggin = Хвост
marking-DemomTailUpAnimated = Аркана, хвост (Вверх, анимированный)
marking-DemomTailUpAnimated-up_waggin = Хвост

# Туловище
marking-DemonChestCowSpots = Аркана, туловище (Коровьи пятна)
marking-DemonChestCowSpots-cow_spots = Пятна
marking-DemonChestGuard = Аркана, туловище (Защита)
marking-DemonChestGuard-guards_stripes = Линии
marking-DemonChestLinesEmperos = Аркана, туловище (Линии Императора)
marking-DemonChestLinesEmperos-lines_emperos = Линии
marking-DemonChestQueenLines = Аркана, туловище (Линии Королевы)
marking-DemonChestQueenLines-queen_lines = Линии
marking-DemonChestTreeLines = Аркана, туловище (Древесные линии)
marking-DemonChestTreeLines-tree_lines = Линии
marking-DemonChestTrinitySpots = Аркана, туловище (Троичные пятна)
marking-DemonChestTrinitySpots-trinity_spots = Пятна

# Борода
marking-DemonGoatee = Аркана, Козлиная бородка

# Глаза
marking-ADTDemonrigth_eye = Аркана, Правый глаз
marking-ADTDemonrigth_eye-tattoo_eye_r = Глаз
marking-ADTDemonleft_eye = Аркана, Левый глаз
marking-ADTDemonleft_eye-tattoo_eye_l = Глаз
marking-DemonrigthEye = Аркана, Правый глаз
marking-DemonrigthEye-tattoo_eye_r = Глаз
marking-DemonleftEye = Аркана, Левый глаз
marking-DemonleftEye-tattoo_eye_l = Глаз

# Прочее
marking-Allsuccubus = Аркана, Суккуб
marking-Allsuccubus-succubus = Узор

# Порождения лаваленда
marking-DemonDrakeTile = Аркана, хвост Дрейка
marking-DemonDrakeTile-tail_drake = Хвост
marking-DemonDrakeTile-tail_drake_secondary = Шипы
marking-DemonDrakeTileAnimated = Аркана, хвост Дрейка (Анимированный)
marking-DemonDrakeTileAnimated-tail_drake_wagging = Хвост
marking-DemonDrakeTileAnimated-tail_drake_wagging_secondary = Шипы
marking-DemonDrakeSpine = Аркана, позвоночник Дрейка
marking-DemonDrakeSpine-drake_spine = Позвоночник
marking-DemonDrakeLArm = Аркана, рука Дрейка (левая)
marking-DemonDrakeLArm-l_drake_arm = Рука
marking-DemonDrakeRArm = Аркана, рука Дрейка (правая)
marking-DemonDrakeRArm-r_drake_arm = Рука

# Рога
marking-DemonCowHorns = Аркана, рога (Коровьи)
marking-DemonCowHorns-cow_horns = Рога
marking-DemonHornsDeer = Аркана, рога (Оленьи)
marking-DemonHornsDeer-deer_antlers_horns = Рога
marking-DemonHornsSmall = Аркана, рога (Маленькие)
marking-DemonHornsSmall-small_horns = Рога
marking-DemonHornsBuffalo = Аркана, рога (Бычьи)
marking-DemonHornsBuffalo-horns_buffalo = Рога
marking-DemonHornsCarpicorn = Аркана, рога (Козерожьи)
marking-DemonHornsCarpicorn-horns_capricorn = Рога
marking-DemonHornsDevil = Аркана, рога (Дьявольские)
marking-DemonHornsDevil-horns_devil = Рога
marking-DemonHornsDevil2 = Аркана, рога (Дьявольские, 2)
marking-DemonHornsDevil2-horns_devil2 = Рога
marking-DemonHornsDevil3 = Аркана, рога (Дьявольские, 3)
marking-DemonHornsDevil3-horns_devil3 = Рога
marking-DemonHornsDevil4 = Аркана, рога (Дьявольские, 4)
marking-DemonHornsDevil4-horns_devil4 = Рога
marking-DemonHornsRam = Аркана, рога (Бараньи)
marking-DemonHornsRam-horns_ram = Рога
marking-DemonHornsUnicorn = Аркана, рога (Единорожьи)
marking-DemonHornsUnicorn-horns_unicorn = Рога

# Рога 32х64
marking-DemonHornsBackwardHorns = Аркана, рога (Обратные)
marking-DemonHornsBackwardHorns-backward_horns = Рога
marking-DemonHornsDarkCrown = Аркана, рога (Тёмная корона)
marking-DemonHornsDarkCrown-dark_crown = Рога
marking-DemonHornsDevilPrimeSi1 = Аркана, рога (Прайм, зловещие)
marking-DemonHornsDevilPrimeSi1-devil_prime1_s = Рога
marking-DemonHornsDevilPrime1 = Аркана, рога (Прайм, 1)
marking-DemonHornsDevilPrime1-devil_prime1 = Рога
marking-DemonHornsDevilPrime2 = Аркана, рога (Прайм, 2)
marking-DemonHornsDevilPrime2-devil_prime2 = Рога
marking-DemonHornsFatHorn = Аркана, рога (Толстые)
marking-DemonHornsFatHorn-fat_horn = Рога
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Причёски
marking-ADTDemonHairBubbleGum = Жвачка
marking-ADTDemonHairGorgona = Горгона
marking-ADTDemonHairGorgona2 = Горгона 2
marking-ADTDemonHairMorningHairStyle = Утренний стиль
marking-ADTDemonHairMorningHairStyle2 = Утренний стиль 2
marking-ADTDemonHairMorningHairStyle3 = Утренний стиль 3
marking-ADTDemonHairPonyTail = Пони стайл
marking-ADTDemonHairShavedFemale = Выбритая женская
marking-ADTDemonHairShavedUnisex = Выбритая унисекс
marking-ADTDemonHairValkyrieScythe = Коса валькирии
marking-ADTDemonHairValkyrieScythe2 = Коса валькирии 2
marking-ADTDemonHairValkyrieScythe3 = Коса валькирии 3
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ent-BaseMobDemon = Урист МакАркана
.desc = { ent-BaseMobSpeciesOrganic.desc }
.suffix = Аркана
ent-MobDemonDummy = { ent-BaseSpeciesDummy }
.desc = { ent-BaseSpeciesDummy.desc }
2 changes: 2 additions & 0 deletions Resources/Locale/ru-RU/_ADT/prototypes/Species/demon.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
species-name-demon = Аркана
species-name-demonspecies = Аркана
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ chat-language-Xeno-name = Ксеноморфный
chat-language-DroneTalk-name = Дронов
# Mono
chat-language-Blob-name = Блобовый
chat-language-Blob-name = Блобовый
4 changes: 4 additions & 0 deletions Resources/Locale/ru-RU/_EE/language/language.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
language-Kelael-name = Кела'эл
language-Kelael-description =
Утончённый инфернальный язык, на котором говорят арканы.
Плавные гласные и мягкий ритм делают речь похожей на таинственный напев.
2 changes: 1 addition & 1 deletion Resources/Locale/ru-RU/_Mono/traits/language-traits.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ trait-language-gary-name = Гэри
trait-language-gary-desc = Хаха, Гэри!
trait-language-NovaCygni-name = Нова Цигни
trait-language-NovaCygni-desc = Государственный язык СССП. Для большинства звучит похоже на Сол Общий, но более грубо. Его использование распространилось среди поселенцев СССП и членов Paycheck Bratva.
trait-language-NovaCygni-desc = Государственный язык СССП. Для большинства звучит похоже на Сол Общий, но более грубо. Его использование распространилось среди поселенцев СССП и членов Paycheck Bratva.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ent-MobMonkeyDemon = { ent-MobMonkey }
.desc = { ent-MobMonkey.desc }
.suffix = AI, Аркана
Loading
Loading