Implemented using libopus for the Opus codec, same as is used in Discord.
This adds the following cvars:
- `voice_chat` On/Off, triggers self-deafen state on server via weaponprefs
- `voice_mode` Activity/PTT
- `voice_selfmute` On/Off, triggers self-mute state on server via weaponprefs
- `voice_inputamp` -30 to 30, scales input by value in decibels
- `voice_activationthreshold` -30 to 0, if any peak in a frame is higher, activates voice
- `voice_loopback` On/Off, plays back local transcoded voice
- `voice_proximity` On/Off, enables proximity effects for server
- `voice_distanceattenuation_distance` distance in fracunits to scale voice volume over
- `voice_distanceattenuation_factor` distance in logarithmic factor to scale voice volume by distance to. e.g. 0.5 for "half as loud" at or above max distance
- `voice_stereopanning_factor` at 1.0, player voices are panned to left or right speaker, scaling to no effect at 0.0
- `voice_concurrentattenuation_factor` the logarithmic factor to attenuate player voices with concurrent speakers
- `voice_concurrentattenuation_min` the minimum concurrent speakers before global concurrent speaker attenuation
- `voice_concurrentattenuation_max` the maximum concurrent speakers for full global concurrent speaker attenuation
- `voice_servermute` whether voice chat is enabled on this server. visible from MS via bitflag
- `voicevolume` local volume of all voice playback
A Voice Options menu is added with a subset of these options, and Server Options has server mute.
Taking the old charge idea, but instead of missiles, it's bananas that explode on the floor and can only be lobbed forward. Charging creates more projectiles in a circle pattern around it.
Differences from Lua version:
- Does not set cusval
- Does not have individual states for pulley, hook
- Simply sets sprite on S_INVISIBLE
- Does not do P_CheckPosition, sets Z directly
- Does not spawn chain visual every tic
- Spawns a single object and vertically stretches it to
the correct length
- MT_IPULLUP has MF_SCENERY and a short-circuiting
thinker, also MF_NOBLOCKMAP so there is never any
collision against it (it is a controller)
- MT_PULLUPHOOK has MF_NOCLIP to avoid extra collisions
while moving
- Right on the line, P_PointOnLineSide may disagree with
P_TraceWaypointTraversal.
- If this happens, nextwaypoint may update ahead of the
finish line before the player crosses it.
- This bloats the finish line distance and triggers lap
cheat prevention, preventing the player from gaining a
lap.
- Since this only seems like it can happen very near to
the line, simply don't update waypoints if the player is
touching the line but hasn't crossed it.
- This will cause distancetofinish to jump but only for a
very short distance (the radius of the player).