vkmEngine 1.0.0
A C++ game engine · vkmengine.com
Loading...
Searching...
No Matches
net_server.h
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <functional>
6#include <memory>
7#include <string>
8#include <vector>
9
10#include "ecs/component/core/transform.h"
11#include "ecs/entity.h"
12#include "net/prediction/command.h"
13#include "net/prediction/rewind.h"
14#include "net/replication/silence.h"
15#include "net/replication/snapshot.h"
16#include "net/transport/connection.h"
17#include "net/transport/join_cookie.h"
18#include "net/wire/bit_stream.h"
19#include "net/wire/protocol.h"
20
21namespace Vkm::Engine {
22
23class Scene;
24class ResourceManager;
25struct NetCore;
26
33class NetServer {
34 public:
40 using SpawnPlayer = std::function<EntityId(Scene&, ResourceManager&, PlayerId)>;
41
47 using DespawnPlayer = std::function<void(Scene&, ResourceManager&, PlayerId, EntityId)>;
48
49 public:
50 explicit NetServer(NetCore& core);
51 ~NetServer();
52
53 NetServer(const NetServer& other) = delete;
54 NetServer& operator=(const NetServer& other) = delete;
55
56 NetServer(NetServer && other) = delete;
57 NetServer& operator=(NetServer && other) = delete;
58
59 public:
60 void onSpawn(SpawnPlayer spawn, DespawnPlayer despawn);
61
63 void open(uint32_t maxPlayers);
64
66 void close();
67
68 void advance(float seconds);
69
71 void receive(Scene& scene, ResourceManager& resources);
72
74 void beginTick(uint32_t tick);
75
77 void endTick(const Scene& scene, uint32_t tick);
78
80 void send(Scene& scene, uint32_t tick);
81
88 const InputCommand* commandFor(EntityId entity) const;
89
97 void rewind(Scene& scene, EntityId shooter);
98
100 void restore(Scene& scene);
101
104
105 size_t playerCount() const { return m_peers.size(); }
106
107 std::string describe() const;
108
109 private:
110 struct Peer;
111
113 struct Rewound {
114 EntityId entity;
115 Transform transform;
116 };
117
118 private:
128 NetSnapshotStats sendSnapshot(Scene& scene, const NetSchema& schema, Peer& peer, uint32_t tick);
129
138 void holdScalesToTheWire(Scene& scene);
139
155 bool vetHello(
156 const NetAddress& from,
157 uint64_t echoed,
158 BitReader& reader,
159 uint32_t& actions,
160 uint64_t& actionNames
161 );
162
171 void acceptCommands(Peer& peer, BitReader& reader);
172
186 void greet(
187 const NetAddress& from,
188 uint64_t echoed,
189 BitReader& hello,
190 Scene& scene,
191 ResourceManager& resources
192 );
193
194 void challenge(const NetAddress& to);
195 void refuse(const NetAddress& from, NetRefusal reason, uint64_t token);
196 void welcome(Peer& peer, const NetAddress& to);
197
205 PlayerId freePlayerId() const;
206 void dropPeer(Scene& scene, ResourceManager& resources, size_t index, const char* why);
207
208 Peer* findPeer(const NetAddress& address);
209
210 private:
211 NetCore& m_core;
212
213 std::vector<std::unique_ptr<Peer>> m_peers;
214
215 SpawnPlayer m_spawn;
216 DespawnPlayer m_despawn;
217
218 uint32_t m_maxPlayers = 0;
219 PlayerId m_nextPlayer = 1;
220
221 NetSnapshotStats m_lastSnapshot;
222 bool m_warnedScale = false;
223
224 NetRewind m_rewind;
225 std::vector<Rewound> m_rewound;
226
227 NetSilenceMap m_silence;
228
229 NetJoinCookie m_cookie;
230 double m_seconds = 0.0;
231
232 uint32_t m_refusedMismatch = 0;
233 uint32_t m_refusedFull = 0;
234
235 std::vector<InputCommand> m_received;
236
238 NetConnection m_unseated;
239};
240
241} // namespace Vkm::Engine
void rewind(Scene &scene, EntityId shooter)
Put every player but shooter where shooter saw them.
std::function< void(Scene &, ResourceManager &, PlayerId, EntityId)> DespawnPlayer
Undo what SpawnPlayer did.
Definition net_server.h:47
void receive(Scene &scene, ResourceManager &resources)
Take every datagram that has arrived, then give back the seats that are going.
std::function< EntityId(Scene &, ResourceManager &, PlayerId)> SpawnPlayer
What a joining player is given, decided by the game.
Definition net_server.h:40
void close()
Tell every player goodbye and forget them.
void open(uint32_t maxPlayers)
Start taking up to maxPlayers players, under a fresh join key.
void forgetWorld()
Drop everything naming an entity; see NetSession::forgetWorld.
const InputCommand * commandFor(EntityId entity) const
The command entity's player sent for this tick.
void send(Scene &scene, uint32_t tick)
Send every player who has answered its snapshot of this tick.
void beginTick(uint32_t tick)
Hand every player the command its entity runs this tick.
void endTick(const Scene &scene, uint32_t tick)
Remember where every player is, for judging a shot later.
void restore(Scene &scene)
Put back exactly what rewind moved.
Open type-erased resource registry with typed handles and generational lifetimes.
Definition resource_manager.h:46
Central registry managing entities and an open set of component types.
Definition scene.h:29
Names one entity of one Scene, for as long as that slot holds it.
Definition entity.h:23
Everything one simulation tick was told to do, as a value.
Definition input_command.h:25
What a session's server and client halves share: the socket, what the two ends agreed,...
Definition net_session.h:53
Local position, rotation and scale of an entity.
Definition transform.h:17