Elevator fix 2.0#1067
Conversation
|
@WardexOfficial |
📝 WalkthroughWalkthroughКомпоненты лифта (ComplexElevatorComponent, ElevatorButtonComponent, ElevatorDoorComponent, ElevatorPointComponent) перенесены из Content.Server в Content.Shared с сетевой синхронизацией. Логика движения лифта переведена на фазовый автомат через новый ElevatorMovingComponent, переписаны телепортация и урон при прибытии, добавлены debug-verb'ы для администраторов и вызовы Dirty в командах управления этажами. ChangesПереработка системы лифта
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ElevatorButton
participant ComplexElevatorSystem
participant ElevatorMovingComponent
participant ElevatorDoorComponent
participant AtmosphereSystem
participant DamageableSystem
ElevatorButton->>ComplexElevatorSystem: HandleButtonPress
ComplexElevatorSystem->>ElevatorMovingComponent: создать/обновить TargetFloor и Phase=DoorClosing
ComplexElevatorSystem->>ElevatorDoorComponent: закрыть двери
ComplexElevatorSystem->>AtmosphereSystem: ClearGasInTargetArea
ComplexElevatorSystem->>DamageableSystem: KillEntitiesInTargetArea
ComplexElevatorSystem->>ComplexElevatorSystem: TeleportToFloor
ComplexElevatorSystem->>ElevatorMovingComponent: удалить компонент
Suggested labels: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 error, 1 warning, 1 inconclusive)
✅ Passed checks (7 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.cs`:
- Around line 5-8: Move ComplexElevatorComponent out of the server-only assembly
into the actual shared location so the type is truly available to both client
and server, and keep its namespace aligned with the shared assembly. Also
replace the mutable List<string> used by Floors under [AutoNetworkedField] with
a clone-safe networked representation or another synchronization approach in
ComplexElevatorComponent so state replication/prediction does not depend on
shared mutable collection state.
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs`:
- Around line 253-270: `HandleButtonPress()` is doing routing, validation,
execution, and delay setup in one place, but elevator interactions should follow
the OnEvent -> TryDo -> CanDo -> Do pattern. Refactor `ComplexElevatorSystem` by
introducing a public `TryHandleButtonPress(...)` that the event handler calls, a
separate `Can...(...)` check for the moving-state/button-type conditions, and a
dedicated `Do...(...)` method for `MoveToFloor`/`MoveUp`/`MoveDown` plus
`SetButtonDelay`. Keep `HandleButtonPress(...)` as a thin router or replace it
with the new `Try...` entrypoint so each responsibility is split cleanly.
- Around line 89-90: The Update() hot path in ComplexElevatorSystem currently
allocates a new List<EntityUid> every tick for toRemove, which creates per-frame
garbage. Move this buffer to a reusable field on ComplexElevatorSystem, clear it
at the start of Update(), and reuse it in the
EntityQueryEnumerator<ElevatorMovingComponent, ComplexElevatorComponent>() loop
instead of constructing a new list each call.
- Around line 113-117: The elevator flow in ComplexElevatorSystem should not
advance to WaitingForSend unless TryCloseDoorsForFloor actually succeeds.
Capture the boolean result from TryCloseDoorsForFloor in the movement handling
logic, and only set moving.Phase to ElevatorMovementPhase.WaitingForSend and
update MovementStartTime when the door closure returns true; otherwise leave the
elevator in the current state and do not Dirty the movement as ready to send.
- Around line 237-248: The teleport placement in ComplexElevatorSystem uses
manual world-position subtraction before SetCoordinates(), which mixes
coordinate spaces. Update the logic in the entity loop to derive destCoords
through the transform system’s parent-aware conversion (for the destParent)
instead of computing entWorldPos -
_transform.GetWorldPosition(destParent.Value). Keep the fix localized around
targetWorldPos, destParent, and _transform.SetCoordinates so rotated or
nonstandard parents resolve correctly.
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.cs`:
- Around line 14-18: Move the two SubscribeLocalEvent registrations from
InitializeDebug() into the main Initialize() method on
ComplexElevatorSystem.Debug, since *System*.cs should register subscriptions
only in Initialize(). Remove InitializeDebug() entirely after relocating the
AddAdminElevatorVerbs and AddAdminPointVerbs subscriptions.
- Around line 66-73: The debug instant-teleport path in
ComplexElevatorSystem.Debug should clear any active elevator motion before
changing floors. Update the Teleport here instantly action inside the Act block
to remove or reset the existing ElevatorMovingComponent on the elevator entity
before setting CurrentFloor, Dirty, and calling TeleportToFloor. Use the
existing debug helpers in ComplexElevatorSystem.Debug.cs to locate the flow and
ensure Update() cannot resume the old route afterward.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 9a6fa3c9-3836-43c5-bfef-9982f80119aa
📒 Files selected for processing (8)
Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.csContent.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.csContent.Server/_Scp/ComplexElevator/ComplexElevatorSystem.csContent.Server/_Scp/ComplexElevator/ElevatorButtonComponent.csContent.Server/_Scp/ComplexElevator/ElevatorCommands.csContent.Server/_Scp/ComplexElevator/ElevatorDoorComponent.csContent.Server/_Scp/ComplexElevator/ElevatorMovingComponent.csContent.Server/_Scp/ComplexElevator/ElevatorPointComponent.cs
f7b0e7a to
8b9ed24
Compare
541b07d to
6e78754
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs`:
- Around line 217-233: The teleport loop in ComplexElevatorSystem currently
ignores the new ComplexElevatorComponent flags, so buckled entities are always
skipped and pull relations are always broken. Update the logic around
TryComp<BuckleComponent>, TryComp<PullableComponent>, and
TryComp<PullerComponent> to consult TeleportBuckled and TeleportPulled before
continuing or calling _pulling.TryStopPull, so entities are only excluded or
detached when the corresponding setting is disabled.
- Around line 184-186: Update GetButtonUseDelay in ComplexElevatorSystem so
IntermediateDelay is only counted when the elevator actually uses the
intermediate floor. When UseIntermediateFloor is false, exclude
elevator.Comp.IntermediateDelay from the button lockout; keep the existing
DoorCloseDelay, SendDelay, and the extra second as appropriate.
- Around line 258-270: The button handling in ComplexElevatorSystem currently
calls SetButtonDelay unconditionally after MoveToFloor, MoveUp, or MoveDown,
which can block the button even when no movement starts. Update the switch path
so SetButtonDelay is only applied when the selected movement method actually
initiates motion, using the return/result of MoveToFloor, MoveUp, and MoveDown
(or equivalent state checks) to guard the delay. Keep the fix localized around
the button action flow in ComplexElevatorSystem and the movement helpers so
failed requests do not trigger use-delay.
In `@Content.Server/_Scp/ComplexElevator/ElevatorMovingComponent.cs`:
- Around line 6-25: The new networked shared component lacks required XML
documentation for its public contract. Add /// <summary> comments to
ElevatorMovingComponent, each public field (TargetFloor, MovementStartTime,
Phase), and the ElevatorMovementPhase enum so the state and phase meanings are
documented for the networked API. Keep the summaries brief but explicit about
what each field represents and how the phase enum is used by
ElevatorMovingComponent.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: d080f9ff-c95f-4e58-8be8-29c62eb30ef5
📒 Files selected for processing (8)
Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.csContent.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.csContent.Server/_Scp/ComplexElevator/ComplexElevatorSystem.csContent.Server/_Scp/ComplexElevator/ElevatorButtonComponent.csContent.Server/_Scp/ComplexElevator/ElevatorCommands.csContent.Server/_Scp/ComplexElevator/ElevatorDoorComponent.csContent.Server/_Scp/ComplexElevator/ElevatorMovingComponent.csContent.Server/_Scp/ComplexElevator/ElevatorPointComponent.cs
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs (1)
7-26: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winДобавьте XML-документацию для нового сетевого контракта.
Новый shared-компонент
ElevatorButtonComponentиElevatorButtonTypeне документированы, хотя это публичный сетевой контракт. As per coding guidelines,Each public field in a component must have XML documentation with a /// <summary> comment.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs` around lines 7 - 26, Add XML documentation to the new public networked contract in ElevatorButtonComponent and ElevatorButtonType: document the component class and each public field/property-like member (ElevatorId, ButtonType, Floor) with a /// <summary> comment, and also document the ElevatorButtonType enum and each enum value so the shared contract matches the coding guidelines.Source: Coding guidelines
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (2)
122-186: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick winКритично: побочные эффекты (очистка газа/крушение) применяются до подтверждения успеха телепортации; при провале нет выхода из состояния движения.
Во всех трёх переходах (
WaitingForSend/промежуточный этаж,WaitingForSend/финальный этаж,Travelling) порядок такой:ClearGasInTargetArea(uid, floorId); KillEntitiesInTargetArea((uid, elevator), floorId, exempt); if (TeleportToFloor(uid, floorId, elevator, toTeleport)) { ... }Если
TeleportToFloorвернётfalse(например,TryFindPointне находит точку илиdestParent == null),moving.MovementStartTimeне обновляется иmoving.Phaseне меняется — на следующем тикеelapsed >= SendDelay/IntermediateDelayостанется истинным, и блок выполнится СНОВА: газ и урон в целевой зоне будут применяться каждый тик бесконечно, а лифт навсегда «зависнет» в состоянии движения (кнопки заблокированы черезHasComp<ElevatorMovingComponent>). В отличие от этого, фазаDoorClosingкорректно обрабатывает провал черезtoRemove.Add(uid); continue;.🐛 Предлагаемое исправление (по аналогии с фазой DoorClosing)
if (elevator.UseIntermediateFloor) { var toTeleport = CollectEntitiesOnElevator(uid); var exempt = new HashSet<EntityUid>(toTeleport.Select(t => t.Item1)); ClearGasInTargetArea(uid, elevator.IntermediateFloorId); KillEntitiesInTargetArea((uid, elevator), elevator.IntermediateFloorId, exempt); if (TeleportToFloor(uid, elevator.IntermediateFloorId, elevator, toTeleport)) { elevator.CurrentFloor = elevator.IntermediateFloorId; Dirty(uid, elevator); _audio.PlayPvs(elevator.TravelSound, uid); moving.Phase = ElevatorMovementPhase.Travelling; moving.MovementStartTime = _timing.CurTime; } + else + { + toRemove.Add(uid); + } }(аналогично для второй ветки
elseи для фазыTravelling)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs` around lines 122 - 186, The elevator transition logic in ComplexElevatorSystem applies gas clearing and entity killing before confirming TeleportToFloor succeeds, and it does not exit the movement state on failure. In the WaitingForSend and Travelling branches, move the side effects to run only after a successful TeleportToFloor call, and if teleportation fails, handle it like DoorClosing by removing the movement state for the elevator entity so it does not retry forever. Use the existing helpers TeleportToFloor, ClearGasInTargetArea, KillEntitiesInTargetArea, and the moving.Phase / toRemove flow to keep the behavior consistent across all three transition paths.
89-197: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick winКритично: очистка
toRemoveвыполняется внутриwhile, а не после него — modifying the same-typed query mid-iteration.
foreach (var movingUid in toRemove)(строки 189-196) находится внутри телаwhile (query.MoveNext(...))— закрывающая скобкаwhileтолько на строке 197. Из-за этого:
RemComp<ElevatorMovingComponent>(movingUid)вызывается, пока тот жеEntityQueryEnumerator<ElevatorMovingComponent, ComplexElevatorComponent>ещё активен и итерируется по сущностям с этим же компонентом — удаление компонента у одной сущности во время перечисления по её же типу небезопасно (инвалидация архетипа/пропуски/повторная обработка).- Цикл выполняется на КАЖДОЙ итерации внешнего
while, а не один раз после его завершения — при нескольких активных лифтах один и тот жеtoRemoveбудет повторно обрабатываться N раз (N = число ещё не пройденных сущностей).As per path instructions, для
*System.csобязателенss14-standard-optimizations/ss14-ecs-systemsконтекст, где итерация поEntityQueryEnumeratorне должна пересекаться с мутацией того же набора компонентов без deferred-подхода.🐛 Предлагаемое исправление
while (query.MoveNext(out var uid, out var moving, out var elevator)) { ... - - foreach (var movingUid in toRemove) - { - RemComp<ElevatorMovingComponent>(movingUid); - if (TryComp<ComplexElevatorComponent>(movingUid, out var movingElevator)) - { - UpdateButtonLights((movingUid, movingElevator)); - } - } } + + foreach (var movingUid in toRemove) + { + RemComp<ElevatorMovingComponent>(movingUid); + if (TryComp<ComplexElevatorComponent>(movingUid, out var movingElevator)) + { + UpdateButtonLights((movingUid, movingElevator)); + } + } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs` around lines 89 - 197, The cleanup loop in ComplexElevatorSystem.Update is running inside the EntityQueryEnumerator iteration, which mutates ElevatorMovingComponent while the same query is still active and also repeats the removals for every entity. Move the toRemove processing block outside the while(query.MoveNext(...)) loop so all RemComp<ElevatorMovingComponent> and UpdateButtonLights calls happen after enumeration finishes, using the existing toRemove list and the Update method as the main location to fix.Source: Path instructions
Content.Shared/_Scp/ComplexElevator/ComplexElevatorComponent.cs (1)
49-60: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winДобавьте XML-документацию для новых публичных полей.
TeleportBuckled,TeleportPulled,CrushEntitiesOnArrival,CrushDamage— новый публичный сетевой контракт компонента, но без/// <summary>. As per coding guidelines,Each public field in a component must have XML documentation with a /// <summary> comment.As per path instructions,Document public methods, public API points and DataField contracts via summary tags.📝 Пример документации
+ /// <summary> + /// Переносить ли пристёгнутые (buckled) сущности вместе с лифтом. + /// </summary> [DataField] public bool TeleportBuckled = true; + /// <summary> + /// Переносить ли сущности, участвующие в pull-связи, вместе с лифтом. + /// </summary> [DataField] public bool TeleportPulled = true; + /// <summary> + /// Наносить ли урон сущностям, оказавшимся в зоне прибытия лифта. + /// </summary> [DataField] public bool CrushEntitiesOnArrival = true; + /// <summary> + /// Величина Blunt-урона, применяемого при прибытии, если <see cref="CrushEntitiesOnArrival"/> включено. + /// </summary> [DataField] public float CrushDamage = 2000f;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Scp/ComplexElevator/ComplexElevatorComponent.cs` around lines 49 - 60, Add XML <summary> documentation to each new public DataField in ComplexElevatorComponent: TeleportBuckled, TeleportPulled, CrushEntitiesOnArrival, and CrushDamage. Update the field declarations in the component so each one has a concise summary describing its behavior and contract, matching the existing public API documentation style used elsewhere in the component.Sources: Coding guidelines, Path instructions
♻️ Duplicate comments (1)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (1)
213-295: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winДублирование логики сбора сущностей +
TeleportBuckled/TeleportPulledпо-прежнему не используются.Новый
CollectEntitiesOnElevator(274-295) дублирует фильтрацию buckled/blacklist из внутренней веткиTeleportToFloor(233-253), но не содержит логики остановки pull — то есть теперь в кодовой базе два почти одинаковых прохода по AABB с расхождением в деталях, что усложняет поддержку. Кроме того, поляelevatorComp.TeleportBuckled/TeleportPulledпо-прежнему нигде не читаются ни в одном из двух мест — то же самое, что уже обсуждалось ранее без исправления.Дублирование логики — новое наблюдение; неиспользуемые флаги — повтор ранее поднятого и не устранённого вопроса.
♻️ Предложение
Вынести общий приватный метод
CollectTeleportCandidates(EntityUid uid, TransformComponent elevatorTransform, ComplexElevatorComponent elevatorComp), возвращающийList<(EntityUid, Vector2)>и учитывающийTeleportBuckled/TeleportPulled, и использовать его как изTeleportToFloor, так и изCollectEntitiesOnElevator.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs` around lines 213 - 295, The new entity-collection logic is duplicated between TeleportToFloor and CollectEntitiesOnElevator, and the TeleportBuckled/TeleportPulled flags still are not being used anywhere. Extract the shared AABB/entity filtering and pull-stopping behavior into a single private helper such as CollectTeleportCandidates that takes the elevator transform and ComplexElevatorComponent, then call it from both TeleportToFloor and CollectEntitiesOnElevator so the buckled/pulled rules are applied consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs`:
- Around line 128-171: The elevator movement path in
ComplexElevatorSystem.Update is allocating a new HashSet via LINQ each time a
phase transition runs, which is a hot-path issue. Replace the repeated new
HashSet<EntityUid>(toTeleport.Select(...)) calls with a reusable buffer field
(for example an exempt EntityUid set on the system) and populate it with an
explicit loop instead of Select. Apply the same pattern in both travel branches
and the intermediate-delay branch so CollectEntitiesOnElevator, TeleportToFloor,
and KillEntitiesInTargetArea can use the reused exemption set without per-tick
collection allocations.
In `@Content.Shared/_Scp/ComplexElevator/ElevatorDoorComponent.cs`:
- Around line 7-15: Add XML summary documentation to the public networked fields
in ElevatorDoorComponent: both ElevatorId and Floor need /// <summary> comments
to satisfy the component documentation guideline. Update the field declarations
in ElevatorDoorComponent so the public contract is documented consistently with
other components, without changing their DataField/AutoNetworkedField behavior.
In `@Content.Shared/_Scp/ComplexElevator/ElevatorPointComponent.cs`:
- Around line 7-12: Add XML documentation for the public FloorId field in
ElevatorPointComponent by including a /// <summary> comment directly above the
field declaration; keep the summary concise and descriptive so it matches the
component documentation standards for public fields.
---
Outside diff comments:
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs`:
- Around line 122-186: The elevator transition logic in ComplexElevatorSystem
applies gas clearing and entity killing before confirming TeleportToFloor
succeeds, and it does not exit the movement state on failure. In the
WaitingForSend and Travelling branches, move the side effects to run only after
a successful TeleportToFloor call, and if teleportation fails, handle it like
DoorClosing by removing the movement state for the elevator entity so it does
not retry forever. Use the existing helpers TeleportToFloor,
ClearGasInTargetArea, KillEntitiesInTargetArea, and the moving.Phase / toRemove
flow to keep the behavior consistent across all three transition paths.
- Around line 89-197: The cleanup loop in ComplexElevatorSystem.Update is
running inside the EntityQueryEnumerator iteration, which mutates
ElevatorMovingComponent while the same query is still active and also repeats
the removals for every entity. Move the toRemove processing block outside the
while(query.MoveNext(...)) loop so all RemComp<ElevatorMovingComponent> and
UpdateButtonLights calls happen after enumeration finishes, using the existing
toRemove list and the Update method as the main location to fix.
In `@Content.Shared/_Scp/ComplexElevator/ComplexElevatorComponent.cs`:
- Around line 49-60: Add XML <summary> documentation to each new public
DataField in ComplexElevatorComponent: TeleportBuckled, TeleportPulled,
CrushEntitiesOnArrival, and CrushDamage. Update the field declarations in the
component so each one has a concise summary describing its behavior and
contract, matching the existing public API documentation style used elsewhere in
the component.
In `@Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs`:
- Around line 7-26: Add XML documentation to the new public networked contract
in ElevatorButtonComponent and ElevatorButtonType: document the component class
and each public field/property-like member (ElevatorId, ButtonType, Floor) with
a /// <summary> comment, and also document the ElevatorButtonType enum and each
enum value so the shared contract matches the coding guidelines.
---
Duplicate comments:
In `@Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs`:
- Around line 213-295: The new entity-collection logic is duplicated between
TeleportToFloor and CollectEntitiesOnElevator, and the
TeleportBuckled/TeleportPulled flags still are not being used anywhere. Extract
the shared AABB/entity filtering and pull-stopping behavior into a single
private helper such as CollectTeleportCandidates that takes the elevator
transform and ComplexElevatorComponent, then call it from both TeleportToFloor
and CollectEntitiesOnElevator so the buckled/pulled rules are applied
consistently.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4787ec9b-8153-460f-bcfc-1886b18aab7e
📒 Files selected for processing (7)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.csContent.Server/_Scp/ComplexElevator/ElevatorDoorComponent.csContent.Server/_Scp/ComplexElevator/ElevatorMovingComponent.csContent.Shared/_Scp/ComplexElevator/ComplexElevatorComponent.csContent.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.csContent.Shared/_Scp/ComplexElevator/ElevatorDoorComponent.csContent.Shared/_Scp/ComplexElevator/ElevatorPointComponent.cs
💤 Files with no reviewable changes (1)
- Content.Server/_Scp/ComplexElevator/ElevatorDoorComponent.cs
|
@WardexOfficial Джокер, иди сюда |
|
Пока-что не уверен в принятии этого ПРа |


Краткое описание | Short description
Теперь лифт точно-преточно работает, и более менее оптимизирован.
Ссылка на багрепорт/Предложение | Related Issue/Bug Report
Медиа (Видео/Скриншоты) | Media (Video/Screenshots)
Changelog
🆑 Fire_Helper/Патріот. Neyran
Summary by CodeRabbit
New Features
Bug Fixes