]> git.localhorst.tv Git - blank.git/blob - src/server/ServerState.cpp
load models from assets
[blank.git] / src / server / ServerState.cpp
1 #include "ServerState.hpp"
2
3 #include "../app/Environment.hpp"
4 #include "../app/TextureIndex.hpp"
5 #include "../io/WorldSave.hpp"
6 #include "../net/io.hpp"
7
8 #include <iostream>
9
10
11 namespace blank {
12 namespace server {
13
14 ServerState::ServerState(
15         HeadlessEnvironment &env,
16         const Generator::Config &gc,
17         const World::Config &wc,
18         const WorldSave &ws,
19         const Config &config
20 )
21 : env(env)
22 , shapes()
23 , block_types()
24 , models()
25 , world(block_types, wc)
26 , generator(gc)
27 , chunk_loader(world.Chunks(), generator, ws)
28 , spawner(world, models, env.rng)
29 , server(config.net, world, wc, ws)
30 , loop_timer(16) {
31         TextureIndex tex_index;
32         env.loader.LoadShapes("default", shapes);
33         env.loader.LoadBlockTypes("default", block_types, tex_index, shapes);
34         env.loader.LoadModels("default", models, tex_index, shapes);
35         if (models.size() < 2) {
36                 throw std::runtime_error("need at least two models to run");
37         }
38         generator.LoadTypes(block_types);
39         spawner.LimitModels(1, models.size());
40         server.SetPlayerModel(models[0]);
41
42         loop_timer.Start();
43
44         std::cout << "listening on UDP port " << config.net.port << std::endl;
45 }
46
47 ServerState::~ServerState() {
48
49 }
50
51
52 void ServerState::Handle(const SDL_Event &event) {
53         if (event.type == SDL_QUIT) {
54                 std::cout << "saving remaining chunks" << std::endl;
55                 for (Chunk &chunk : world.Chunks()) {
56                         if (chunk.ShouldUpdateSave()) {
57                                 chunk_loader.SaveFile().Write(chunk);
58                         }
59                 }
60                 env.state.PopAll();
61         }
62 }
63
64
65 void ServerState::Update(int dt) {
66         loop_timer.Update(dt);
67         server.Handle();
68         int world_dt = 0;
69         while (loop_timer.HitOnce()) {
70                 spawner.Update(loop_timer.Interval());
71                 world.Update(loop_timer.Interval());
72                 world_dt += loop_timer.Interval();
73                 loop_timer.PopIteration();
74         }
75         chunk_loader.Update(dt);
76         if (world_dt > 0) {
77                 server.Update(world_dt);
78         }
79 }
80
81
82 void ServerState::Render(Viewport &viewport) {
83
84 }
85
86 }
87 }