This velocity estimation routine has been present since the beginning of
time, but it seems that this actually does more harm than good.
Neither the vanilla client nor BetterSpades implements velocity
estimation.
Currently OpenSpades doesnt send the extended version info which contains
some useful info to the server even when being told that it wants it.
This commit adds sending of the packet so servers will receive such info when
they ask for it.
Improves the smoothness of non-local player movement in a server that
sends ten WorldUpdate packages for each second (i.e., 10 updates per
second).
I wouldn't dare to relax the bound further since this technique is
extremely susceptible to jitter. The server sending WorldUpdate packets
with `PACKET_FLAG_UNSEQUENCED` isn't exactly helping since that
introduces discontinuity into the received position stream, and the
denominator lower bound is the only thing that keeps the estimation from
exploding. (The packets should really be unreliable + sequenced.)
This problem was originally reported in:
<https://github.com/piqueserver/piqueserver/issues/586>
Upon receiving `IntelCapture` with `winning = 1`, the voxlap client
resets both team scores and the holding status of both teams' intels,
but OpenSpades didn't do that, resulting in a weird behavior described
in piqueserver/piqueserver#586. This commit changes OpenSpades' behavior
to be congruent with the voxlap client's behavior.
Fixes#890.
- Replaced raw pointers with references or smart pointers. Nullable
references are represented by `stmp::optional<const T&>`. (There are
many raw pointers still remaining. They should be replaced at some
point.)
- Added class template specializations `stmp::optional<T &>` and
`stmp::optional<const T&>`.
- Fixed `stmp::optional`'s various behaviors
- `World::{players, playerPersistents}` are now `std::array`.
- More uses of `stmp::optional` to clarify the semantics
- Renamed `PlayerThrownGrenade` to `PlayerThrewGrenade`
- Replaced old-style `for` loops with range based ones
- Deleted `Player`'s default constructors and `operator =`
- Deleted `TCGameMode`'s default constructor and `operator =`
- Deleted `CTFGameMode`'s default constructor and `operator =`
- Replaced `static_cast` with `dynamic_cast` for down-casting
- `RefCountedObject::operator*()` no longer requires non-constness to
return `T &`.
- Replaced the uses of `std::vector::operator[]` with `std::vector::at`
for bounds checking.
- Made some methods of `GameMap` `const`.
- Added some null checks.
Previously, the end of map transfer was detected by a number of fallible
heuristics, including checking if the map is loadable on every non-map
packet, when a timeout had been reached, or the map size given by the
server was reached. This broke in a number of scenarios, including when
an unexpected packet was sent.
Instead, we now detect the end of the map transfer when we receive a
state packet, as intended by the protocol.
* Add Counter for world updates per Second
This work was just done for personal testing and is probably not up to the
required code standards. Nonetheless, I have decided to send a PR as it is very
useful information and a good starting point.
* add MarkWorldUpdate method