1 #include "ServerState.hpp"
3 #include "../app/Environment.hpp"
4 #include "../io/WorldSave.hpp"
5 #include "../net/io.hpp"
13 ServerState::ServerState(
14 HeadlessEnvironment &env,
15 const Generator::Config &gc,
16 const World::Config &wc,
22 , world(res.block_types, wc)
24 , chunk_loader(world.Chunks(), generator, ws)
25 , spawner(world, res.models)
26 , server(config.net, world, wc, ws)
28 res.Load(env.loader, "default");
29 if (res.models.size() < 2) {
30 throw std::runtime_error("need at least two models to run");
32 generator.LoadTypes(res.block_types);
33 spawner.LimitModels(1, res.models.size());
34 server.SetPlayerModel(res.models[0]);
38 std::cout << "listening on UDP port " << config.net.port << std::endl;
41 ServerState::~ServerState() {
46 void ServerState::Handle(const SDL_Event &event) {
47 if (event.type == SDL_QUIT) {
48 std::cout << "saving remaining chunks" << std::endl;
49 for (Chunk &chunk : world.Chunks()) {
50 if (chunk.ShouldUpdateSave()) {
51 chunk_loader.SaveFile().Write(chunk);
59 void ServerState::Update(int dt) {
60 loop_timer.Update(dt);
61 if (!loop_timer.HitOnce() && loop_timer.IntervalRemain() > 1) {
62 server.Wait(loop_timer.IntervalRemain() - 1);
65 if (dt == 0 && !server.Ready()) {
66 // effectively wait in a spin loop
72 while (loop_timer.HitOnce()) {
73 spawner.Update(loop_timer.Interval());
74 world.Update(loop_timer.Interval());
75 world_dt += loop_timer.Interval();
76 loop_timer.PopIteration();
78 chunk_loader.Update(dt);
80 server.Update(world_dt);
83 std::cout << "world dt at " << world_dt << "ms!" << std::endl;
88 void ServerState::Render(Viewport &viewport) {