-
Notifications
You must be signed in to change notification settings - Fork 450
Xenowears #519
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Xenowears #519
Changes from all commits
d75250d
e80c764
cc5414f
a8524d7
8ab671c
28e345b
a603b30
1371b09
fc018e5
cd0bf23
6784da1
8c03e4b
719bb42
55403e7
fde7559
706ba96
bbe1ae7
019d300
37a3022
bc27467
042bb45
7e2b6dd
bd8e17f
00136a8
61c52b6
fe2e4c1
991a5f4
50aba46
657ef43
de92a82
5e1ceb2
2909755
8e25fb2
674d92e
6789498
c83e991
830a142
cb629b8
c9d15d9
a6dffca
5113905
a2d944f
adb58d8
5df91d5
dd5aabe
f9431e1
18617ff
41067af
4b95e1f
0cce9cd
dea0aaf
7e62550
34c5e0f
5e35d63
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| using Robust.Shared.Audio; | ||
| using Robust.Shared.GameStates; | ||
| using Robust.Shared.Map; | ||
|
|
||
| namespace Content.Shared.Clothing.Components; | ||
|
|
||
| /// <summary> | ||
| /// Indicates that the clothing entity emits sound when it moves. | ||
| /// </summary> | ||
| [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] | ||
| public sealed partial class EmitsSoundOnMoveComponent : Component | ||
| { | ||
| [ViewVariables(VVAccess.ReadWrite)] | ||
| [DataField(required: true), AutoNetworkedField] | ||
| public SoundSpecifier SoundCollection = default!; | ||
|
|
||
| [ViewVariables(VVAccess.ReadWrite)] | ||
| [DataField("requiresGravity"), AutoNetworkedField] | ||
| public bool RequiresGravity = true; | ||
|
|
||
| [ViewVariables(VVAccess.ReadOnly)] | ||
| public EntityCoordinates LastPosition = EntityCoordinates.Invalid; | ||
|
|
||
| /// <summary> | ||
| /// The distance moved since the played sound. | ||
| /// </summary> | ||
| [ViewVariables(VVAccess.ReadOnly)] | ||
| public float SoundDistance = 0f; | ||
|
|
||
| /// <summary> | ||
| /// Whether this item is equipped in a inventory item slot. | ||
| /// </summary> | ||
| [ViewVariables(VVAccess.ReadOnly)] | ||
| public bool IsSlotValid = true; | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| using System.Numerics; | ||
| using Content.Shared.Clothing.Components; | ||
| using Content.Shared.Gravity; | ||
| using Content.Shared.Inventory; | ||
| using Content.Shared.Inventory.Events; | ||
| using Content.Shared.Mobs.Components; | ||
| using Content.Shared.Movement.Components; | ||
| using Robust.Shared.Audio.Systems; | ||
| using Robust.Shared.Physics.Components; | ||
| using Robust.Shared.Timing; | ||
|
|
||
| namespace Content.Shared.Clothing.Systems; | ||
|
|
||
| public sealed class EmitsSoundOnMoveSystem : EntitySystem | ||
ShadesMars marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| [Dependency] private readonly SharedAudioSystem _audio = default!; | ||
| [Dependency] private readonly SharedMapSystem _grid = default!; | ||
| [Dependency] private readonly SharedGravitySystem _gravity = default!; | ||
| [Dependency] private readonly IGameTiming _timing = default!; | ||
|
|
||
| private EntityQuery<InputMoverComponent> _moverQuery; | ||
| private EntityQuery<PhysicsComponent> _physicsQuery; | ||
| private EntityQuery<ClothingComponent> _clothingQuery; | ||
|
|
||
| public override void Initialize() | ||
| { | ||
| _moverQuery = GetEntityQuery<InputMoverComponent>(); | ||
| _physicsQuery = GetEntityQuery<PhysicsComponent>(); | ||
| _clothingQuery = GetEntityQuery<ClothingComponent>(); | ||
|
|
||
| SubscribeLocalEvent<EmitsSoundOnMoveComponent, GotEquippedEvent>(OnEquipped); | ||
| SubscribeLocalEvent<EmitsSoundOnMoveComponent, GotUnequippedEvent>(OnUnequipped); | ||
| } | ||
|
|
||
| private void OnEquipped(EntityUid uid, EmitsSoundOnMoveComponent component, GotEquippedEvent args) | ||
| { | ||
| component.IsSlotValid = !args.SlotFlags.HasFlag(SlotFlags.POCKET); | ||
| } | ||
|
|
||
| private void OnUnequipped(EntityUid uid, EmitsSoundOnMoveComponent component, GotUnequippedEvent args) | ||
| { | ||
| component.IsSlotValid = true; | ||
| } | ||
|
|
||
| public override void Update(float frameTime) | ||
| { | ||
| var query = EntityQueryEnumerator<EmitsSoundOnMoveComponent>(); | ||
| while (query.MoveNext(out var uid, out var comp)) | ||
| { | ||
| UpdateSound(uid, comp); | ||
| } | ||
| query.Dispose(); | ||
| } | ||
|
|
||
| private void UpdateSound(EntityUid uid, EmitsSoundOnMoveComponent component) | ||
| { | ||
| if (!_physicsQuery.TryGetComponent(uid, out var physics)) | ||
| return; | ||
|
|
||
| // Space does not transmit sound | ||
| if (Transform(uid).GridUid == null) | ||
| return; | ||
|
|
||
| if (component.RequiresGravity && _gravity.IsWeightless(uid, physics, Transform(uid))) | ||
| return; | ||
|
|
||
| var parent = Transform(uid).ParentUid; | ||
|
|
||
| var isWorn = parent is { Valid: true } && | ||
| _clothingQuery.TryGetComponent(uid, out var clothing) | ||
| && clothing.InSlot != null | ||
| && component.IsSlotValid; | ||
| // If this entity is worn by another entity, use that entity's coordinates | ||
| var coordinates = isWorn ? Transform(parent).Coordinates : Transform(uid).Coordinates; | ||
| var distanceNeeded = (isWorn && _moverQuery.TryGetComponent(parent, out var mover) && mover.Sprinting) | ||
| ? 1.5f // The parent is a mob that is currently sprinting | ||
| : 2f; // The parent is not a mob or is not sprinting | ||
|
|
||
| if (!coordinates.TryDistance(EntityManager, component.LastPosition, out var distance) || distance > distanceNeeded) | ||
| component.SoundDistance = distanceNeeded; | ||
| else | ||
| component.SoundDistance += distance; | ||
|
|
||
| component.LastPosition = coordinates; | ||
| if (component.SoundDistance < distanceNeeded) | ||
| return; | ||
| component.SoundDistance -= distanceNeeded; | ||
|
|
||
| var sound = component.SoundCollection; | ||
| var audioParams = sound.Params | ||
| .WithVolume(sound.Params.Volume) | ||
| .WithVariation(sound.Params.Variation ?? 0f); | ||
|
|
||
| _audio.PlayPredicted(sound, uid, uid, audioParams); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -377,3 +377,14 @@ | |
| sprite: Clothing/OuterClothing/Misc/red_racoon.rsi | ||
| - type: Clothing | ||
| sprite: Clothing/OuterClothing/Misc/red_racoon.rsi | ||
|
|
||
| - type: entity | ||
| parent: ClothingOuterBase | ||
| id: ClothingOuterUnathiRobe | ||
| name: roughspun robes | ||
| description: A traditional Unathi garment. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We don't have Unathi on EE (yet?), we have Lizardpeople.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. They are the same.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am aware, change the name of the clothing or change the name of the species.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| components: | ||
| - type: Sprite | ||
| sprite: Clothing/OuterClothing/Misc/unathirobe.rsi | ||
| - type: Clothing | ||
| sprite: Clothing/OuterClothing/Misc/unathirobe.rsi | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| - type: entity | ||
| parent: Clothing | ||
| id: ClothingClothWrap | ||
| name: cloth wraps | ||
| description: A roll of treated canvas used for wrapping claws or paws. | ||
DEATHB4DEFEAT marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| components: | ||
| - type: Item | ||
| size: Small | ||
| storedRotation: -90 | ||
| - type: Sprite | ||
| state: icon | ||
| sprite: Clothing/Shoes/Misc/clothWrap.rsi | ||
| - type: Clothing | ||
| slots: | ||
| - gloves | ||
| - FEET | ||
| sprite: Clothing/Shoes/Misc/clothWrap.rsi | ||
| - type: Construction | ||
| graph: ClothingClothWrap | ||
| node: shoes | ||
| - type: Butcherable | ||
| butcheringType: Knife | ||
| spawned: | ||
| - id: MaterialCloth1 | ||
| amount: 1 | ||
| - type: Food | ||
| requiresSpecialDigestion: true | ||
| - type: SolutionContainerManager | ||
| solutions: | ||
| food: | ||
| maxVol: 10 | ||
| reagents: | ||
| - ReagentId: Fiber | ||
| Quantity: 10 | ||
| - type: Tag | ||
| tags: | ||
| - ClothMade | ||
| - WhitelistChameleon | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| - type: constructionGraph | ||
| id: ClothingClothWrap | ||
| start: start | ||
| graph: | ||
| - node: start | ||
| edges: | ||
| - to: shoes | ||
| steps: | ||
| - material: Cloth | ||
| amount: 2 | ||
| doAfter: 1 | ||
| - node: shoes | ||
| entity: ClothingClothWrap |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| { | ||
| "version": 1, | ||
| "license": "CC-BY-SA-3.0", | ||
| "copyright": "Made by mnemotechnician (GitHub)", | ||
| "size": { | ||
| "x": 32, | ||
| "y": 32 | ||
| }, | ||
| "states": [ | ||
| { | ||
| "name": "icon" | ||
| }, | ||
| { | ||
| "name": "equipped-NECK", | ||
| "directions": 4 | ||
| }, | ||
| { | ||
| "name": "inhand-left", | ||
| "directions": 4 | ||
| }, | ||
| { | ||
| "name": "inhand-right", | ||
| "directions": 4 | ||
| } | ||
| ] | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| { | ||
| "version": 1, | ||
| "license": "CC-BY-SA-3.0", | ||
| "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/blob/master/icons/mob/clothing/suit.dmi", | ||
| "size": { | ||
| "x": 32, | ||
| "y": 32 | ||
| }, | ||
| "states": [ | ||
| { | ||
| "name": "icon" | ||
| }, | ||
| { | ||
| "name": "equipped-NECK", | ||
| "directions": 4 | ||
| } | ||
| ] | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.