| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- using Content.Server.IdentityManagement;
- using Content.Shared.Clothing.Components;
- using Content.Shared.Clothing.EntitySystems;
- using Content.Shared.IdentityManagement.Components;
- using Content.Shared.Prototypes;
- using Robust.Shared.Prototypes;
- namespace Content.Server.Clothing.Systems;
- public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
- {
- [Dependency] private readonly IPrototypeManager _proto = default!;
- [Dependency] private readonly IComponentFactory _factory = default!;
- [Dependency] private readonly IdentitySystem _identity = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<ChameleonClothingComponent, MapInitEvent>(OnMapInit);
- SubscribeLocalEvent<ChameleonClothingComponent, ChameleonPrototypeSelectedMessage>(OnSelected);
- }
- private void OnMapInit(EntityUid uid, ChameleonClothingComponent component, MapInitEvent args)
- {
- SetSelectedPrototype(uid, component.Default, true, component);
- }
- private void OnSelected(EntityUid uid, ChameleonClothingComponent component, ChameleonPrototypeSelectedMessage args)
- {
- SetSelectedPrototype(uid, args.SelectedId, component: component);
- }
- private void UpdateUi(EntityUid uid, ChameleonClothingComponent? component = null)
- {
- if (!Resolve(uid, ref component))
- return;
- var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default, component.RequireTag);
- UI.SetUiState(uid, ChameleonUiKey.Key, state);
- }
- /// <summary>
- /// Change chameleon items name, description and sprite to mimic other entity prototype.
- /// </summary>
- public void SetSelectedPrototype(EntityUid uid, string? protoId, bool forceUpdate = false,
- ChameleonClothingComponent? component = null)
- {
- if (!Resolve(uid, ref component, false))
- return;
- // check that wasn't already selected
- // forceUpdate on component init ignores this check
- if (component.Default == protoId && !forceUpdate)
- return;
- // make sure that it is valid change
- if (string.IsNullOrEmpty(protoId) || !_proto.TryIndex(protoId, out EntityPrototype? proto))
- return;
- if (!IsValidTarget(proto, component.Slot, component.RequireTag))
- return;
- component.Default = protoId;
- UpdateIdentityBlocker(uid, component, proto);
- UpdateVisuals(uid, component);
- UpdateUi(uid, component);
- Dirty(uid, component);
- }
- private void UpdateIdentityBlocker(EntityUid uid, ChameleonClothingComponent component, EntityPrototype proto)
- {
- if (proto.HasComponent<IdentityBlockerComponent>(_factory))
- EnsureComp<IdentityBlockerComponent>(uid);
- else
- RemComp<IdentityBlockerComponent>(uid);
- if (component.User != null)
- _identity.QueueIdentityUpdate(component.User.Value);
- }
- }
|