Losing a head doesn't mean you lose your eyes #3956 #4061 (#4225)

Co-authored-by: Michael Will <will_m@outlook.de>
This commit is contained in:
scrato
2021-08-07 23:18:42 +02:00
committed by GitHub
parent 83be320a74
commit 298a77c7af
2 changed files with 86 additions and 53 deletions

View File

@@ -1,4 +1,4 @@
using Content.Client.Cuffs.Components; using Content.Client.Cuffs.Components;
using Content.Shared.Body.Components; using Content.Shared.Body.Components;
using Content.Shared.Body.Part; using Content.Shared.Body.Part;
using Content.Shared.CharacterAppearance; using Content.Shared.CharacterAppearance;
@@ -120,15 +120,10 @@ namespace Content.Client.CharacterAppearance
return; return;
} }
var layer = args.Part.ToHumanoidLayer(); var layers = args.Part.ToHumanoidLayers();
if (layer == null)
{
return;
}
// TODO BODY Layer color, sprite and state // TODO BODY Layer color, sprite and state
sprite.LayerSetVisible(layer, true); foreach (var layer in layers)
sprite.LayerSetVisible(layer, true);
} }
public void BodyPartRemoved(BodyPartRemovedEventArgs args) public void BodyPartRemoved(BodyPartRemovedEventArgs args)
@@ -143,15 +138,10 @@ namespace Content.Client.CharacterAppearance
return; return;
} }
var layer = args.Part.ToHumanoidLayer(); var layers = args.Part.ToHumanoidLayers();
if (layer == null)
{
return;
}
// TODO BODY Layer color, sprite and state // TODO BODY Layer color, sprite and state
sprite.LayerSetVisible(layer, false); foreach (var layer in layers)
sprite.LayerSetVisible(layer, false);
} }
} }
} }

View File

@@ -1,47 +1,90 @@
using System; using System;
using System.Collections.Generic;
using Content.Shared.Body.Part; using Content.Shared.Body.Part;
namespace Content.Shared.CharacterAppearance namespace Content.Shared.CharacterAppearance
{ {
public static class HumanoidVisualLayersExtension public static class HumanoidVisualLayersExtension
{ {
public static HumanoidVisualLayers? ToHumanoidLayer(this SharedBodyPartComponent part) public static IEnumerable<HumanoidVisualLayers> ToHumanoidLayers(this SharedBodyPartComponent part)
{ {
return part.PartType switch switch (part.PartType)
{ {
BodyPartType.Other => null, case BodyPartType.Other:
BodyPartType.Torso => HumanoidVisualLayers.Chest, yield break;
BodyPartType.Head => HumanoidVisualLayers.Head, case BodyPartType.Torso:
BodyPartType.Arm => part.Symmetry switch yield return HumanoidVisualLayers.Chest;
{ break;
BodyPartSymmetry.None => null, case BodyPartType.Head:
BodyPartSymmetry.Left => HumanoidVisualLayers.LArm, yield return HumanoidVisualLayers.Head;
BodyPartSymmetry.Right => HumanoidVisualLayers.RArm, yield return HumanoidVisualLayers.Eyes;
_ => throw new ArgumentOutOfRangeException() yield return HumanoidVisualLayers.FacialHair;
}, yield return HumanoidVisualLayers.Hair;
BodyPartType.Hand => part.Symmetry switch yield return HumanoidVisualLayers.StencilMask;
{ break;
BodyPartSymmetry.None => null, case BodyPartType.Arm:
BodyPartSymmetry.Left => HumanoidVisualLayers.LHand, switch (part.Symmetry)
BodyPartSymmetry.Right => HumanoidVisualLayers.RHand, {
_ => throw new ArgumentOutOfRangeException() case BodyPartSymmetry.None:
}, yield break;
BodyPartType.Leg => part.Symmetry switch case BodyPartSymmetry.Left:
{ yield return HumanoidVisualLayers.LArm;
BodyPartSymmetry.None => null, break;
BodyPartSymmetry.Left => HumanoidVisualLayers.LLeg, case BodyPartSymmetry.Right:
BodyPartSymmetry.Right => HumanoidVisualLayers.RLeg, yield return HumanoidVisualLayers.RArm;
_ => throw new ArgumentOutOfRangeException() break;
}, default:
BodyPartType.Foot => part.Symmetry switch yield break;
{ }
BodyPartSymmetry.None => null, yield break;
BodyPartSymmetry.Left => HumanoidVisualLayers.LFoot, case BodyPartType.Hand:
BodyPartSymmetry.Right => HumanoidVisualLayers.RFoot, switch (part.Symmetry)
_ => throw new ArgumentOutOfRangeException() {
}, case BodyPartSymmetry.None:
_ => throw new ArgumentOutOfRangeException() yield break;
}; case BodyPartSymmetry.Left:
yield return HumanoidVisualLayers.LHand;
break;
case BodyPartSymmetry.Right:
yield return HumanoidVisualLayers.RHand;
break;
default:
yield break;
}
yield break;
case BodyPartType.Leg:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
yield break;
case BodyPartSymmetry.Left:
yield return HumanoidVisualLayers.LLeg;
break;
case BodyPartSymmetry.Right:
yield return HumanoidVisualLayers.RLeg;
break;
default:
yield break;
}
yield break;
case BodyPartType.Foot:
switch (part.Symmetry)
{
case BodyPartSymmetry.None:
yield break;
case BodyPartSymmetry.Left:
yield return HumanoidVisualLayers.LFoot;
break;
case BodyPartSymmetry.Right:
yield return HumanoidVisualLayers.RFoot;
break;
default:
yield break;
}
yield break;
default:
yield break;
}
} }
} }
} }