Markings overhaul (#35938)
* markings displacement setup * ok i got it! * fix map updating * remove trackingLayers * markings clean up and modernizize * marking disabling displacements * markings restriction * dehihienize * dehihiniezize 2 * aa * nice
This commit is contained in:
@@ -334,10 +334,13 @@ public sealed class ClientClothingSystem : ClothingSystem
|
|||||||
if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId))
|
if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, revealedLayers))
|
if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, out var displacementKey))
|
||||||
|
{
|
||||||
|
revealedLayers.Add(displacementKey);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true);
|
RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,17 +9,31 @@ public sealed class DisplacementMapSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly ISerializationManager _serialization = default!;
|
[Dependency] private readonly ISerializationManager _serialization = default!;
|
||||||
|
|
||||||
public bool TryAddDisplacement(DisplacementData data, SpriteComponent sprite, int index, string key, HashSet<string> revealedLayers)
|
/// <summary>
|
||||||
|
/// Attempting to apply a displacement map to a specific layer of SpriteComponent
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">Information package for applying the displacement map</param>
|
||||||
|
/// <param name="sprite">SpriteComponent</param>
|
||||||
|
/// <param name="index">Index of the layer where the new map layer will be added</param>
|
||||||
|
/// <param name="key">Unique layer key, which will determine which layer to apply displacement map to</param>
|
||||||
|
/// <param name="displacementKey">The key of the new displacement map layer added by this function.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool TryAddDisplacement(DisplacementData data,
|
||||||
|
SpriteComponent sprite,
|
||||||
|
int index,
|
||||||
|
object key,
|
||||||
|
out string displacementKey)
|
||||||
{
|
{
|
||||||
|
displacementKey = $"{key}-displacement";
|
||||||
|
|
||||||
|
if (key.ToString() is null)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (data.ShaderOverride != null)
|
if (data.ShaderOverride != null)
|
||||||
sprite.LayerSetShader(index, data.ShaderOverride);
|
sprite.LayerSetShader(index, data.ShaderOverride);
|
||||||
|
|
||||||
var displacementKey = $"{key}-displacement";
|
if (sprite.LayerMapTryGet(displacementKey, out var oldIndex))
|
||||||
if (!revealedLayers.Add(displacementKey))
|
sprite.RemoveLayer(oldIndex);
|
||||||
{
|
|
||||||
Log.Warning($"Duplicate key for DISPLACEMENT: {displacementKey}.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//allows you not to write it every time in the YML
|
//allows you not to write it every time in the YML
|
||||||
foreach (var pair in data.SizeMaps)
|
foreach (var pair in data.SizeMaps)
|
||||||
@@ -45,21 +59,22 @@ public sealed class DisplacementMapSystem : EntitySystem
|
|||||||
if (actualRSI is not null)
|
if (actualRSI is not null)
|
||||||
{
|
{
|
||||||
if (actualRSI.Size.X != actualRSI.Size.Y)
|
if (actualRSI.Size.X != actualRSI.Size.Y)
|
||||||
Log.Warning($"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked");
|
{
|
||||||
|
Log.Warning(
|
||||||
|
$"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked");
|
||||||
|
}
|
||||||
|
|
||||||
var layerSize = actualRSI.Size.X;
|
var layerSize = actualRSI.Size.X;
|
||||||
if (data.SizeMaps.ContainsKey(layerSize))
|
if (data.SizeMaps.TryGetValue(layerSize, out var map))
|
||||||
displacementDataLayer = data.SizeMaps[layerSize];
|
displacementDataLayer = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
|
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
|
||||||
displacementLayer.CopyToShaderParameters!.LayerKey = key;
|
displacementLayer.CopyToShaderParameters!.LayerKey = key.ToString() ?? "this is impossible";
|
||||||
|
|
||||||
sprite.AddLayer(displacementLayer, index);
|
sprite.AddLayer(displacementLayer, index);
|
||||||
sprite.LayerMapSet(displacementKey, index);
|
sprite.LayerMapSet(displacementKey, index);
|
||||||
|
|
||||||
revealedLayers.Add(displacementKey);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -349,13 +349,15 @@ namespace Content.Client.Hands.Systems
|
|||||||
sprite.LayerSetData(index, layerData);
|
sprite.LayerSetData(index, layerData);
|
||||||
|
|
||||||
// Add displacement maps
|
// Add displacement maps
|
||||||
if (hand.Location == HandLocation.Left && handComp.LeftHandDisplacement is not null)
|
var displacement = hand.Location switch
|
||||||
_displacement.TryAddDisplacement(handComp.LeftHandDisplacement, sprite, index, key, revealedLayers);
|
{
|
||||||
else if (hand.Location == HandLocation.Right && handComp.RightHandDisplacement is not null)
|
HandLocation.Left => handComp.LeftHandDisplacement,
|
||||||
_displacement.TryAddDisplacement(handComp.RightHandDisplacement, sprite, index, key, revealedLayers);
|
HandLocation.Right => handComp.RightHandDisplacement,
|
||||||
//Fallback to default displacement map
|
_ => handComp.HandDisplacement
|
||||||
else if (handComp.HandDisplacement is not null)
|
};
|
||||||
_displacement.TryAddDisplacement(handComp.HandDisplacement, sprite, index, key, revealedLayers);
|
|
||||||
|
if (displacement is not null && _displacement.TryAddDisplacement(displacement, sprite, index, key, out var displacementKey))
|
||||||
|
revealedLayers.Add(displacementKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
RaiseLocalEvent(held, new HeldVisualsUpdatedEvent(uid, revealedLayers), true);
|
RaiseLocalEvent(held, new HeldVisualsUpdatedEvent(uid, revealedLayers), true);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Client.DisplacementMap;
|
||||||
using Content.Shared.CCVar;
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
using Content.Shared.Humanoid.Markings;
|
using Content.Shared.Humanoid.Markings;
|
||||||
@@ -16,6 +17,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
[Dependency] private readonly MarkingManager _markingManager = default!;
|
[Dependency] private readonly MarkingManager _markingManager = default!;
|
||||||
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||||
|
[Dependency] private readonly DisplacementMapSystem _displacement = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -369,6 +371,11 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
|||||||
{
|
{
|
||||||
sprite.LayerSetColor(layerId, Color.White);
|
sprite.LayerSetColor(layerId, Color.White);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (humanoid.MarkingsDisplacement.TryGetValue(markingPrototype.BodyPart, out var displacementData) && markingPrototype.CanBeDisplaced)
|
||||||
|
{
|
||||||
|
_displacement.TryAddDisplacement(displacementData, sprite, targetLayer + j + 1, layerId, out _);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Shared.DisplacementMap;
|
||||||
using Content.Shared.Humanoid.Markings;
|
using Content.Shared.Humanoid.Markings;
|
||||||
using Content.Shared.Humanoid.Prototypes;
|
using Content.Shared.Humanoid.Prototypes;
|
||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
@@ -99,6 +100,12 @@ public sealed partial class HumanoidAppearanceComponent : Component
|
|||||||
|
|
||||||
[DataField]
|
[DataField]
|
||||||
public ProtoId<MarkingPrototype>? UndergarmentBottom = new ProtoId<MarkingPrototype>("UndergarmentBottomBoxers");
|
public ProtoId<MarkingPrototype>? UndergarmentBottom = new ProtoId<MarkingPrototype>("UndergarmentBottomBoxers");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The displacement maps that will be applied to specific layers of the humanoid.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public Dictionary<HumanoidVisualLayers, DisplacementData> MarkingsDisplacement = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
[DataDefinition]
|
[DataDefinition]
|
||||||
|
|||||||
@@ -62,12 +62,12 @@ namespace Content.Shared.Humanoid.Markings
|
|||||||
string species)
|
string species)
|
||||||
{
|
{
|
||||||
var speciesProto = _prototypeManager.Index<SpeciesPrototype>(species);
|
var speciesProto = _prototypeManager.Index<SpeciesPrototype>(species);
|
||||||
var onlyWhitelisted = _prototypeManager.Index(speciesProto.MarkingPoints).OnlyWhitelisted;
|
var markingPoints = _prototypeManager.Index(speciesProto.MarkingPoints);
|
||||||
var res = new Dictionary<string, MarkingPrototype>();
|
var res = new Dictionary<string, MarkingPrototype>();
|
||||||
|
|
||||||
foreach (var (key, marking) in MarkingsByCategory(category))
|
foreach (var (key, marking) in MarkingsByCategory(category))
|
||||||
{
|
{
|
||||||
if (onlyWhitelisted && marking.SpeciesRestrictions == null)
|
if ((markingPoints.OnlyWhitelisted || markingPoints.Points[category].OnlyWhitelisted) && marking.SpeciesRestrictions == null)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
|
|
||||||
|
|
||||||
namespace Content.Shared.Humanoid.Markings;
|
namespace Content.Shared.Humanoid.Markings;
|
||||||
|
|
||||||
@@ -8,13 +7,23 @@ namespace Content.Shared.Humanoid.Markings;
|
|||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public sealed partial class MarkingPoints
|
public sealed partial class MarkingPoints
|
||||||
{
|
{
|
||||||
[DataField("points", required: true)]
|
[DataField(required: true)]
|
||||||
public int Points = 0;
|
public int Points = 0;
|
||||||
[DataField("required", required: true)]
|
|
||||||
public bool Required = false;
|
[DataField(required: true)]
|
||||||
|
public bool Required;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If the user of this marking point set is only allowed to
|
||||||
|
/// use whitelisted markings, and not globally usable markings.
|
||||||
|
/// Only used for validation and profile construction. Ignored anywhere else.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool OnlyWhitelisted;
|
||||||
|
|
||||||
// Default markings for this layer.
|
// Default markings for this layer.
|
||||||
[DataField("defaultMarkings", customTypeSerializer:typeof(PrototypeIdListSerializer<MarkingPrototype>))]
|
[DataField]
|
||||||
public List<string> DefaultMarkings = new();
|
public List<ProtoId<MarkingPrototype>> DefaultMarkings = new();
|
||||||
|
|
||||||
public static Dictionary<MarkingCategories, MarkingPoints> CloneMarkingPointDictionary(Dictionary<MarkingCategories, MarkingPoints> self)
|
public static Dictionary<MarkingCategories, MarkingPoints> CloneMarkingPointDictionary(Dictionary<MarkingCategories, MarkingPoints> self)
|
||||||
{
|
{
|
||||||
@@ -26,6 +35,7 @@ public sealed partial class MarkingPoints
|
|||||||
{
|
{
|
||||||
Points = points.Points,
|
Points = points.Points,
|
||||||
Required = points.Required,
|
Required = points.Required,
|
||||||
|
OnlyWhitelisted = points.OnlyWhitelisted,
|
||||||
DefaultMarkings = points.DefaultMarkings
|
DefaultMarkings = points.DefaultMarkings
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -44,8 +54,9 @@ public sealed partial class MarkingPointsPrototype : IPrototype
|
|||||||
/// use whitelisted markings, and not globally usable markings.
|
/// use whitelisted markings, and not globally usable markings.
|
||||||
/// Only used for validation and profile construction. Ignored anywhere else.
|
/// Only used for validation and profile construction. Ignored anywhere else.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("onlyWhitelisted")] public bool OnlyWhitelisted;
|
[DataField]
|
||||||
|
public bool OnlyWhitelisted;
|
||||||
|
|
||||||
[DataField("points", required: true)]
|
[DataField(required: true)]
|
||||||
public Dictionary<MarkingCategories, MarkingPoints> Points { get; private set; } = default!;
|
public Dictionary<MarkingCategories, MarkingPoints> Points { get; private set; } = default!;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,13 @@ namespace Content.Shared.Humanoid.Markings
|
|||||||
[DataField("coloring")]
|
[DataField("coloring")]
|
||||||
public MarkingColors Coloring { get; private set; } = new();
|
public MarkingColors Coloring { get; private set; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Do we need to apply any displacement maps to this marking? Set to false if your marking is incompatible
|
||||||
|
/// with a standard human doll, and is used for some special races with unusual shapes
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool CanBeDisplaced { get; private set; } = true;
|
||||||
|
|
||||||
[DataField("sprites", required: true)]
|
[DataField("sprites", required: true)]
|
||||||
public List<SpriteSpecifier> Sprites { get; private set; } = default!;
|
public List<SpriteSpecifier> Sprites { get; private set; } = default!;
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
id: VoxFacialHairBeard
|
id: VoxFacialHairBeard
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -11,6 +12,7 @@
|
|||||||
id: VoxFacialHairColonel
|
id: VoxFacialHairColonel
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -20,6 +22,7 @@
|
|||||||
id: VoxFacialHairFu
|
id: VoxFacialHairFu
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -29,6 +32,7 @@
|
|||||||
id: VoxFacialHairMane
|
id: VoxFacialHairMane
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -38,6 +42,7 @@
|
|||||||
id: VoxFacialHairManeSmall
|
id: VoxFacialHairManeSmall
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -47,6 +52,7 @@
|
|||||||
id: VoxFacialHairNeck
|
id: VoxFacialHairNeck
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
@@ -56,6 +62,7 @@
|
|||||||
id: VoxFacialHairTufts
|
id: VoxFacialHairTufts
|
||||||
bodyPart: FacialHair
|
bodyPart: FacialHair
|
||||||
markingCategory: FacialHair
|
markingCategory: FacialHair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
- sprite: Mobs/Customization/vox_facial_hair.rsi
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
id: VoxHairAfro
|
id: VoxHairAfro
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -11,6 +12,7 @@
|
|||||||
id: VoxHairBraids
|
id: VoxHairBraids
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -20,6 +22,7 @@
|
|||||||
id: VoxHairCrestedQuills
|
id: VoxHairCrestedQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -29,6 +32,7 @@
|
|||||||
id: VoxHairEmperorQuills
|
id: VoxHairEmperorQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -38,6 +42,7 @@
|
|||||||
id: VoxHairFlowing
|
id: VoxHairFlowing
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -47,6 +52,7 @@
|
|||||||
id: VoxHairHawk
|
id: VoxHairHawk
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -56,6 +62,7 @@
|
|||||||
id: VoxHairHorns
|
id: VoxHairHorns
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -65,6 +72,7 @@
|
|||||||
id: VoxHairKeelQuills
|
id: VoxHairKeelQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -74,6 +82,7 @@
|
|||||||
id: VoxHairKeetQuills
|
id: VoxHairKeetQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -83,6 +92,7 @@
|
|||||||
id: VoxHairKingly
|
id: VoxHairKingly
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -92,6 +102,7 @@
|
|||||||
id: VoxHairLongBraid
|
id: VoxHairLongBraid
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -101,6 +112,7 @@
|
|||||||
id: VoxHairMange
|
id: VoxHairMange
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -110,6 +122,7 @@
|
|||||||
id: VoxHairMohawk
|
id: VoxHairMohawk
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -119,6 +132,7 @@
|
|||||||
id: VoxHairNights
|
id: VoxHairNights
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -128,6 +142,7 @@
|
|||||||
id: VoxHairPony
|
id: VoxHairPony
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -137,6 +152,7 @@
|
|||||||
id: VoxHairRazorClipped
|
id: VoxHairRazorClipped
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -146,6 +162,7 @@
|
|||||||
id: VoxHairRazor
|
id: VoxHairRazor
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -155,6 +172,7 @@
|
|||||||
id: VoxHairSortBraid
|
id: VoxHairSortBraid
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -164,6 +182,7 @@
|
|||||||
id: VoxHairShortQuills
|
id: VoxHairShortQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -173,6 +192,7 @@
|
|||||||
id: VoxHairSpotty
|
id: VoxHairSpotty
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -182,6 +202,7 @@
|
|||||||
id: VoxHairSurf
|
id: VoxHairSurf
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -191,6 +212,7 @@
|
|||||||
id: VoxHairTielQuills
|
id: VoxHairTielQuills
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -200,6 +222,7 @@
|
|||||||
id: VoxHairWiseBraid
|
id: VoxHairWiseBraid
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
@@ -209,6 +232,7 @@
|
|||||||
id: VoxHairYasu
|
id: VoxHairYasu
|
||||||
bodyPart: Hair
|
bodyPart: Hair
|
||||||
markingCategory: Hair
|
markingCategory: Hair
|
||||||
|
canBeDisplaced: false
|
||||||
speciesRestriction: [Vox]
|
speciesRestriction: [Vox]
|
||||||
sprites:
|
sprites:
|
||||||
- sprite: Mobs/Customization/vox_hair.rsi
|
- sprite: Mobs/Customization/vox_hair.rsi
|
||||||
|
|||||||
@@ -11,10 +11,6 @@
|
|||||||
- type: Body
|
- type: Body
|
||||||
prototype: Vox
|
prototype: Vox
|
||||||
requiredLegs: 2
|
requiredLegs: 2
|
||||||
- type: HumanoidAppearance
|
|
||||||
species: Vox
|
|
||||||
undergarmentTop: UndergarmentTopTanktopVox
|
|
||||||
undergarmentBottom: UndergarmentBottomBoxersVox
|
|
||||||
#- type: VoxAccent # Not yet coded
|
#- type: VoxAccent # Not yet coded
|
||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Vox
|
speechVerb: Vox
|
||||||
@@ -108,6 +104,16 @@
|
|||||||
sprite: "Effects/creampie.rsi"
|
sprite: "Effects/creampie.rsi"
|
||||||
state: "creampie_vox" # Not default
|
state: "creampie_vox" # Not default
|
||||||
visible: false
|
visible: false
|
||||||
|
- type: HumanoidAppearance
|
||||||
|
species: Vox
|
||||||
|
undergarmentTop: UndergarmentTopTanktopVox
|
||||||
|
undergarmentBottom: UndergarmentBottomBoxersVox
|
||||||
|
markingsDisplacement:
|
||||||
|
Hair:
|
||||||
|
sizeMaps:
|
||||||
|
32:
|
||||||
|
sprite: Mobs/Species/Vox/displacement.rsi
|
||||||
|
state: hair
|
||||||
- type: Inventory
|
- type: Inventory
|
||||||
speciesId: vox
|
speciesId: vox
|
||||||
displacements:
|
displacements:
|
||||||
@@ -167,6 +173,12 @@
|
|||||||
species: Vox
|
species: Vox
|
||||||
undergarmentTop: UndergarmentTopTanktopVox
|
undergarmentTop: UndergarmentTopTanktopVox
|
||||||
undergarmentBottom: UndergarmentBottomBoxersVox
|
undergarmentBottom: UndergarmentBottomBoxersVox
|
||||||
|
markingsDisplacement:
|
||||||
|
Hair:
|
||||||
|
sizeMaps:
|
||||||
|
32:
|
||||||
|
sprite: Mobs/Species/Vox/displacement.rsi
|
||||||
|
state: hair
|
||||||
- type: Body
|
- type: Body
|
||||||
prototype: Vox
|
prototype: Vox
|
||||||
- type: Inventory
|
- type: Inventory
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
|
|
||||||
- type: markingPoints
|
- type: markingPoints
|
||||||
id: MobVoxMarkingLimits
|
id: MobVoxMarkingLimits
|
||||||
onlyWhitelisted: true
|
|
||||||
points:
|
points:
|
||||||
Hair:
|
Hair:
|
||||||
points: 1
|
points: 1
|
||||||
@@ -45,34 +44,43 @@
|
|||||||
FacialHair:
|
FacialHair:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
onlyWhitelisted: true
|
||||||
Head:
|
Head:
|
||||||
points: 1
|
points: 1
|
||||||
required: true
|
required: true
|
||||||
|
onlyWhitelisted: true
|
||||||
Snout:
|
Snout:
|
||||||
points: 1
|
points: 1
|
||||||
required: true
|
required: true
|
||||||
defaultMarkings: [ VoxBeak ]
|
defaultMarkings: [ VoxBeak ]
|
||||||
|
onlyWhitelisted: true
|
||||||
Arms:
|
Arms:
|
||||||
points: 4
|
points: 4
|
||||||
required: true
|
required: true
|
||||||
defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ]
|
defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ]
|
||||||
|
onlyWhitelisted: true
|
||||||
Legs:
|
Legs:
|
||||||
points: 4
|
points: 4
|
||||||
required: true
|
required: true
|
||||||
defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ]
|
defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ]
|
||||||
|
onlyWhitelisted: true
|
||||||
UndergarmentTop:
|
UndergarmentTop:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
onlyWhitelisted: true
|
||||||
UndergarmentBottom:
|
UndergarmentBottom:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
onlyWhitelisted: true
|
||||||
Chest:
|
Chest:
|
||||||
points: 1
|
points: 1
|
||||||
required: false
|
required: false
|
||||||
|
onlyWhitelisted: true
|
||||||
Tail:
|
Tail:
|
||||||
points: 1
|
points: 1
|
||||||
required: true
|
required: true
|
||||||
defaultMarkings: [ VoxTail ]
|
defaultMarkings: [ VoxTail ]
|
||||||
|
onlyWhitelisted: true
|
||||||
|
|
||||||
- type: humanoidBaseSprite
|
- type: humanoidBaseSprite
|
||||||
id: MobVoxEyes
|
id: MobVoxEyes
|
||||||
|
|||||||
BIN
Resources/Textures/Mobs/Species/Vox/displacement.rsi/hair.png
Normal file
BIN
Resources/Textures/Mobs/Species/Vox/displacement.rsi/hair.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 347 B |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"license": "CC-BY-SA-3.0",
|
"license": "CC-BY-SA-3.0",
|
||||||
"copyright": "jumpsuit state made by PJB3005. back, hand, head, and eyes states made by Flareguy, ears, hand_l, hand_r and shoes made by TheShuEd",
|
"copyright": "jumpsuit state made by PJB3005. back, hand, head, and eyes states made by Flareguy, ears, hand_l, hand_r, hair and shoes made by TheShuEd",
|
||||||
"size": {
|
"size": {
|
||||||
"x": 32,
|
"x": 32,
|
||||||
"y": 32
|
"y": 32
|
||||||
@@ -38,6 +38,10 @@
|
|||||||
"name": "shoes",
|
"name": "shoes",
|
||||||
"directions": 4
|
"directions": 4
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "hair",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "hand_l",
|
"name": "hand_l",
|
||||||
"directions": 4
|
"directions": 4
|
||||||
|
|||||||
Reference in New Issue
Block a user