Floor cost using vanilla Elevator items (1 per floor)
Config
BuildCostItems.HijackVanillaElevatorPlacement
Permissions
AllowDoorItemOrCost AllowElevatorItemPerFloor
Data Handling Changes
Lifts are saved only when an elevator becomes Ready
No full data save on server save or plugin unload
Cleaner unload process using:
crossReference
Pooled lists
This reduces unnecessary save operations and improves unload safety.
UI Changes
Replaced dual options with a single “Remove Lift” button
(removes previous “Full Remove” "No longer needed")
Added new localization strings:
"Or"
"Elevators"
"Garage Doors"
These support the new door/elevator item cost UI.
⚙ Defaults Updated
Default DoorSkin ID updated
Added new default config keys for:
Door item payment
Elevator item per floor payment
Construction
No longer places walls or roof on Elevator assembly. Only places Doorframes and doors if not already placed. Allows the player to build their walls how they want them and no longer destroys roofs, floors or deplorables due to replacement of entities and stability issues.
Automatic conversion of vanilla elevators placements! "Config Option"
Optional item-based cost for elevator placement to use Vanilla Elevators as cost.
Added ability to convert all vanilla elevators already placed into UpLifted Elevators.
Console command: upl.convert_all
Chat commands:
/convert = Admin command to convert all vanilla elevators
/convert.here = Admin command to convert the elevator you are looking at
Elevator location on screen display.
Chat commands:
/liftmap = Player command to see all elevator locations on the map
/showlift = Admin command to see their lifts.
Performance
Replaced whole-scene scans with an active registry: activeLifts (HashSet) plus crossReference map to track all lift parts. This avoids FindObjectsOfType<Elevator>() on save/load and during lookups.
Throttled network work inside Elevator.Update() (via _lastNetSync) to reduce per-frame net traffic and recursive sync churn.