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 // TODO: this clutter is a giant mess
42 InteractiveState::InteractiveState(MasterState &master, uint32_t player_id)
45 , save(master.GetEnv().config.GetWorldPath(master.GetWorldConf().name, master.GetClientConf().host))
46 , world(block_types, master.GetWorldConf(), save)
47 , chunk_renderer(world, master.GetWorldConf().load.load_dist)
49 master.GetInterfaceConf(),
52 *world.AddPlayer(master.GetInterfaceConf().player_name, player_id)
54 TextureIndex tex_index;
55 master.GetEnv().loader.LoadBlockTypes("default", block_types, tex_index);
56 chunk_renderer.LoadTextures(master.GetEnv().loader, tex_index);
57 chunk_renderer.FogDensity(master.GetWorldConf().fog_density);
58 // TODO: better solution for initializing HUD
59 interface.SelectNext();
62 void InteractiveState::OnEnter() {
63 master.GetEnv().window.GrabMouse();
66 void InteractiveState::Handle(const SDL_Event &event) {
69 interface.HandlePress(event.key);
72 interface.HandleRelease(event.key);
74 case SDL_MOUSEBUTTONDOWN:
75 interface.HandlePress(event.button);
77 case SDL_MOUSEBUTTONUP:
78 interface.HandleRelease(event.button);
81 interface.Handle(event.motion);
84 interface.Handle(event.wheel);
94 void InteractiveState::Update(int dt) {
99 chunk_renderer.Rebase(interface.Player().ChunkCoords());
100 chunk_renderer.Update(dt);
102 master.GetClient().SendPlayerUpdate(interface.Player());
104 glm::mat4 trans = interface.Player().Transform(interface.Player().ChunkCoords());
105 glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f));
106 glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f));
107 master.GetEnv().audio.Position(interface.Player().Position());
108 master.GetEnv().audio.Velocity(interface.Player().Velocity());
109 master.GetEnv().audio.Orientation(dir, up);
112 void InteractiveState::Render(Viewport &viewport) {
113 viewport.WorldPosition(interface.Player().Transform(interface.Player().ChunkCoords()));
114 chunk_renderer.Render(viewport);
115 world.Render(viewport);
116 interface.Render(viewport);
120 MasterState::MasterState(
122 const World::Config &wc,
123 const Interface::Config &ic,
124 const Client::Config &cc)
133 client.GetConnection().SetHandler(this);
136 void MasterState::Quit() {
137 env.state.PopUntil(this);
141 void MasterState::OnEnter() {
142 login_packet = client.SendLogin(intf_conf.player_name);
143 env.state.Push(&init_state);
147 void MasterState::Handle(const SDL_Event &event) {
152 void MasterState::Update(int dt) {
158 void MasterState::Render(Viewport &) {
163 void MasterState::OnPacketLost(std::uint16_t id) {
164 if (id == login_packet) {
165 login_packet = client.SendLogin(intf_conf.player_name);
169 void MasterState::OnTimeout() {
170 if (client.GetConnection().Closed()) {
172 // TODO: push disconnected message
176 void MasterState::On(const Packet::Join &pack) {
177 pack.ReadWorldName(world_conf.name);
181 std::cout << "server changing worlds" << std::endl;
184 std::cout << "joined game" << std::endl;
188 pack.ReadPlayerID(player_id);
189 state.reset(new InteractiveState(*this, player_id));
191 pack.ReadPlayer(state->GetInterface().Player());
193 env.state.PopAfter(this);
194 env.state.Push(state.get());
197 void MasterState::On(const Packet::Part &pack) {
200 std::cout << "kicked by server" << std::endl;
203 std::cout << "login refused by server" << std::endl;