6,071 Commits over 1,614 Days - 0.16cph!
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
Reduce number of unique keys set to prolong time until limit is hit
- round entities to nearest 1000
- round FPS to nearest whole number (and clamp to 512)
- round RAM to nearest 100MB
- round GC count to 2 significant figures (1-9,10-90,100-900,etc)
- round uptime to nearest 15m interval instead of every 30s
- increases time before limit is hit from 7d -> 365d+
Prevent server from crashing if too many keys are set
- stop setting new keys after 50k unique values have been set (it can still assign to previous values)
- prevents server from getting enough unique values to cause the crash
Optimize server startup time by 72s (230s -> 158s) by fetching the spawnables only once instead of doing it for each of the 100 spawn populations
Optimize server startup time by 24s (254s -> 230s) by using HashSet to check for duplicate player models
Add global const for "entity_links" version so we can invalidate all entity links when needed
Cache entity links across server restarts
- if a prefab's sockets change since it was saved it will relink sockets
- works for copy paste (so we can see how things were linked on a remote server)
merge from softcore_tc_limit/map_icons -> main
merge from optimize_spawn_distribution_simple -> main