1 #include "InitialState.hpp"
2 #include "InteractiveState.hpp"
3 #include "MasterState.hpp"
5 #include "../app/Environment.hpp"
6 #include "../app/init.hpp"
7 #include "../app/TextureIndex.hpp"
15 InitialState::InitialState(MasterState &master)
18 message.Position(glm::vec3(0.0f), Gravity::CENTER);
19 message.Set(master.GetEnv().assets.large_ui_font, "logging in");
22 void InitialState::OnEnter() {
26 void InitialState::Handle(const SDL_Event &evt) {
27 if (evt.type == SDL_QUIT) {
32 void InitialState::Update(int dt) {
36 void InitialState::Render(Viewport &viewport) {
37 message.Render(viewport);
41 InteractiveState::InteractiveState(MasterState &master)
44 , save(master.GetEnv().config.GetWorldPath(master.GetWorldConf().name, master.GetClientConf().host))
45 , world(block_types, master.GetWorldConf(), save)
46 , chunk_renderer(world, master.GetWorldConf().load.load_dist)
47 , interface(master.GetInterfaceConf(), master.GetEnv(), world) {
48 TextureIndex tex_index;
49 master.GetEnv().loader.LoadBlockTypes("default", block_types, tex_index);
50 chunk_renderer.LoadTextures(master.GetEnv().loader, tex_index);
51 chunk_renderer.FogDensity(master.GetWorldConf().fog_density);
52 // TODO: better solution for initializing HUD
53 interface.SelectNext();
56 void InteractiveState::OnEnter() {
57 master.GetEnv().window.GrabMouse();
60 void InteractiveState::Handle(const SDL_Event &event) {
63 interface.HandlePress(event.key);
66 interface.HandleRelease(event.key);
68 case SDL_MOUSEBUTTONDOWN:
69 interface.HandlePress(event.button);
71 case SDL_MOUSEBUTTONUP:
72 interface.HandleRelease(event.button);
75 interface.Handle(event.motion);
78 interface.Handle(event.wheel);
88 void InteractiveState::Update(int dt) {
93 chunk_renderer.Rebase(interface.Player().ChunkCoords());
94 chunk_renderer.Update(dt);
96 glm::mat4 trans = interface.Player().Transform(interface.Player().ChunkCoords());
97 glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f));
98 glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f));
99 master.GetEnv().audio.Position(interface.Player().Position());
100 master.GetEnv().audio.Velocity(interface.Player().Velocity());
101 master.GetEnv().audio.Orientation(dir, up);
104 void InteractiveState::Render(Viewport &viewport) {
105 viewport.WorldPosition(interface.Player().Transform(interface.Player().ChunkCoords()));
106 chunk_renderer.Render(viewport);
107 world.Render(viewport);
108 interface.Render(viewport);
112 MasterState::MasterState(
114 const World::Config &wc,
115 const Interface::Config &ic,
116 const Client::Config &cc)
125 client.GetConnection().SetHandler(this);
128 void MasterState::Quit() {
129 env.state.PopUntil(this);
133 void MasterState::OnEnter() {
134 login_packet = client.SendLogin(intf_conf.player_name);
135 env.state.Push(&init_state);
139 void MasterState::Handle(const SDL_Event &event) {
144 void MasterState::Update(int dt) {
150 void MasterState::Render(Viewport &) {
155 void MasterState::OnPacketLost(std::uint16_t id) {
156 if (id == login_packet) {
157 login_packet = client.SendLogin(intf_conf.player_name);
161 void MasterState::OnTimeout() {
162 if (client.GetConnection().Closed()) {
164 // TODO: push disconnected message
168 void MasterState::On(const Packet::Join &pack) {
169 pack.ReadWorldName(world_conf.name);
173 std::cout << "server changing worlds" << std::endl;
176 std::cout << "joined game" << std::endl;
178 state.reset(new InteractiveState(*this));
180 pack.ReadPlayer(state->GetInterface().Player());
182 env.state.PopAfter(this);
183 env.state.Push(state.get());
186 void MasterState::On(const Packet::Part &pack) {
189 std::cout << "kicked by server" << std::endl;
192 std::cout << "login refused by server" << std::endl;