6,083 Commits over 1,614 Days - 0.16cph!
Move upkeep value label 4px down after centering it
Add missing analytics for apartments
- evictions
- apartment value at the time of break-ins (expose raw value from method)
Reserialize TC loot panel prefab first so we can have a clean diff
- try catch the upload so we can remove it from the queue if it fails
- fix static fields not resetting in editor
Add "GetByCrc()" method to FileStorage so we can find files solely by their CRC
Fix the cache not having the EntityID being updated when using ReassignEntityId()
- will fold these into the FileStorage refactor when it lands
Update the UGC uploader to reference FileStorage too instead of buffering in memory
- references CRC, won't upload if the image has been deleted / modified since
- add debouncing so it won't upload images from a sign until a small delay (example: autosave sends image every 30s)
When queuing a sign to be uploaded use the imageId instead of the raw data so we can buffer images in filestorage instead of keeping a 2nd copy in memory
Don't send voicemails & sculptures
- not planning to moderate them, keep it simple by not sending them
merge from main -> ugc_censor_option
merge from main -> optimize_position_update
Fix bases decaying despite TC having upkeep when the decay tick gets slowed down on very high entity count servers
- change decay tick from being a hardcoded 5 entities per tick to budgetted to 0.25ms per tick
- in practice most servers won't hit this: this is 200k decay entities & 10 server FPS to start reaching the budget
- paces so we don't burn budget looping through the list too quickly
Switch batches from channel 1 -> channel 0 so it's ordered with all the other packets (since we no longer use unordered for position packets)
Lower quant from 1cm -> 1mm for position
- switch from sending delta position to sending quantized acceleration so we can keep 1 byte per update after moving to a 10x smaller quant
- if acceleration is larger than 0.127m / tick then it will send full acceleration (allows it to support instant teleports and large changes in velocity)
- will fine-tune values further
Only check if quant settings have changed once per frame in flush instead of every single position packet
Switch from generic stream -> BufferStream in the EntityPositionBatchReader since both demos and network data share the same class of stream for packets
Send positions & rotations quantized
- reduce the 3x positions floats from 4 -> 1 bytes when they are within 1.27m per tick (1cm quantization)
- reduce the 3x rotations from 4 -> 1 byte when they are within 25 degrees per tick (0.2 degree quantization)
- will fine tune the values if it's too high a quant
- fallback to sending the full value when it changes by more than a delta
- tell the client what the quantization is so it can be changed during the session and be captured by demos
merge from server_packet_capture -> main
Add `packet_capture` command to capture outbound packets on the server
- will capture up until a certain size or time limit is reached
- writes to disk with 8MB buffer
- intended to allow capturing network data so we can simulate optimizations on the raw data
- no overhead when turned off
Store entity ID for position ticks in a 1000 sized cache
- reduces entity ID from 8 -> 5 -> 2 bytes (8 now, would be ~5 with VarInt encoding, 2 bytes with index lookup)
- also compresses the parent's network ID when parented
- overkill just for network IDs but basically free since we also want to do lossy compression for positions
- demos store the network ID lookup in the keyframes so it can skip forwards & backwards still
- make batch position packets ordered now (not a big deal since they are way smaller than old ones and max one per server frame)
merge from optimize_upkeep_multiplier -> main
Fix the guide not detecting if the sail would block when lowered but doesn't block when up
- caused the sail to be blocked only when lowered despite the guide making it look ok
▌ ▉▅▄ ▍▉▋▋▅▅▍▄▉▅▊▊▉ ▉▆▉ ▆▆▄▉▊ ▌▋▋▊▍▌▆▇▆ ▆▋▉▌▍▅▊ ▇▋█▆█▉▉█▅▍▉▋▊▊▉▉▊ █▅ ▌▄▅▅ ▆▊▋ ▇▌▌▄▊▊▅▍▌▉▊ ▇▆▆▅▇█▄ ▆█▊▉ ▋▆▍█▌▆▊▆▉▅ ▉▊▆ ▊▉▄ ▆▍▊▋ ▋▄▌▆▅▌ ▊▊▋▅▍▆ ▅▋▅▊▅ ▆▋▌▆ ▊▄▉▌▉▄█▋ █▋ ▇▌▌▌▋█▊▆▍▊▍▉▇▅▆▉█▉▍ ▍▍▅▋▉▄▄ ▇█▊▌▅ ▍▆▇▊▇▆▌▇ ▆█▄▌ ▆▆▅▊ ▇▉▄
Update demos to read the new batched packet format
Update SendNetworkPositions() to use the new batched path
- famous last words but batched position updates shouldn't break so we shouldn't need a ConVar to toggle behavior at runtime
Add batching for position ticks
- new packet type EntityPositionBatch so old demos keep working
- batches together entity position updates per player per server frame
- flushes batches after ServerMgr * Invokes
- skips sending time field if it's the same as the entity before it
Fix mismatch between server's check for sails and client's check
- client uses rays, server used spheres
- the OBB the client used to simulate the new placement wasn't rotated correctly leading to mismatch
Optimize calculating upkeep on the server
- used to iterating through entire buildings when recalculating upkeep
- now sums the building cost of all the entities and only adds & removes cost as entities are changed
- means upkeep is now only multiplying the cached cost * the upkeep multiplier
merge from fix_switch_ammo_reload -> main
Fix guns with partial reloads (shotguns) not reloading all the bullets after switching ammo
- example: 4 buckshot loaded, switch to slugs and it only reloads 4
Add uploading of signs / sculptures / voicemails to our backend
- simple retry: try 1x per minute, give up after 5x attempts
merge from fix_cookable_created_alloc -> main
Fix ItemModCookable allocating a new delegate every time an item is created
merge from cache_entity_links -> main
Re-add the "Restoring X/100,000 links" for cases where the cache links aren't used
Pass `serverStartup` parameter into RestoringLoadedEntityLinks() so we don't call RCON.Update() when pasting with copypaste
- probably harmless but it bugged me
merge from cache_ocean_path -> main
Optimize server startup time by caching the ocean patrol path on disk (158s -> 138s)
- same idea as server occlusion grid being saved
- can increase version number to regenerate next restart
- convar `regenerate_ocean_path` will cause it to regenerate it next startup too
merge from main -> cache_entity_links
merge from optimize_duplicate_player_check -> main
merge from optimize_enforce_limits -> main
merge from fix_steam_setkey_crash -> main