#include "../app/Environment.hpp"
#include "../app/init.hpp"
+#include "../geometry/distance.hpp"
#include "../model/Model.hpp"
#include "../io/WorldSave.hpp"
#include "../world/ChunkIndex.hpp"
, manip(master.GetEnv().audio, sounds, player.GetEntity())
, input(world, player, master.GetClient())
, interface(master.GetConfig(), master.GetEnv().keymap, input, *this)
-, chunk_receiver(world.Chunks(), save)
+, chunk_receiver(master.GetClient(), world.Chunks(), save)
, chunk_renderer(player.GetChunks())
, loop_timer(16)
+, stat_timer(1000)
, sky(master.GetEnv().loader.LoadCubeMap("skybox"))
, update_status()
-, chat(master.GetEnv(), *this, *this) {
+, chat(master.GetEnv(), *this, *this)
+, time_skipped(0)
+, packets_skipped(0) {
if (!save.Exists()) {
save.Write(master.GetWorldConf());
}
chunk_renderer.LoadTextures(master.GetEnv().loader, res.tex_index);
chunk_renderer.FogDensity(master.GetWorldConf().fog_density);
loop_timer.Start();
- if (save.Exists(player)) {
- save.Read(player);
- }
+ stat_timer.Start();
}
void InteractiveState::OnResume() {
void InteractiveState::Update(int dt) {
loop_timer.Update(dt);
+ stat_timer.Update(dt);
master.Update(dt);
chunk_receiver.Update(dt);
if (input.BlockFocus()) {
hud.FocusBlock(input.BlockFocus().GetChunk(), input.BlockFocus().block);
} else if (input.EntityFocus()) {
- hud.FocusEntity(*input.EntityFocus().entity);
+ hud.FocusEntity(input.EntityFocus().GetEntity());
} else {
hud.FocusNone();
}
if (world_dt > 0) {
- input.PushPlayerUpdate(world_dt);
+ if (input.UpdateImportant() || packets_skipped >= master.NetStat().SuggestedPacketSkip()) {
+ input.PushPlayerUpdate(time_skipped + world_dt);
+ time_skipped = 0;
+ packets_skipped = 0;
+ } else {
+ time_skipped += world_dt;
+ ++packets_skipped;
+ }
}
hud.Display(res.block_types[player.GetInventorySlot() + 1]);
+ if (stat_timer.Hit()) {
+ hud.UpdateNetStats(master.NetStat());
+ }
hud.Update(dt);
glm::mat4 trans = player.GetEntity().Transform(player.GetEntity().ChunkCoords());
}
void InteractiveState::Render(Viewport &viewport) {
- viewport.WorldPosition(
- player.GetEntity().Transform(player.GetEntity().ChunkCoords())
- * player.GetEntity().GetModel().EyesTransform());
+ viewport.WorldPosition(player.GetEntity().ViewTransform(player.GetEntity().ChunkCoords()));
if (master.GetConfig().video.world) {
chunk_renderer.Render(viewport);
world.Render(viewport);
+ if (master.GetConfig().video.debug) {
+ world.RenderDebug(viewport);
+ }
sky.Render(viewport);
}
hud.Render(viewport);
if (model_id > 0 && model_id <= res.models.size()) {
res.models.Get(model_id).Instantiate(entity.GetModel());
}
- cout << "spawned entity #" << entity_id << " (" << entity.Name()
- << ") at " << entity.AbsolutePosition() << endl;
}
void InteractiveState::Handle(const Packet::DespawnEntity &pack) {
for (Entity &entity : world.Entities()) {
if (entity.ID() == entity_id) {
entity.Kill();
- cout << "despawned entity #" << entity_id << " (" << entity.Name() << ") at " << entity.AbsolutePosition() << endl;
return;
}
}
}
}
+void InteractiveState::NextCamera() {
+ if (iszero(master.GetEnv().viewport.CameraOffset())) {
+ master.GetEnv().viewport.OffsetCamera(glm::vec3(0.0f, 0.0f, -5.0f));
+ } else {
+ master.GetEnv().viewport.OffsetCamera(glm::vec3(0.0f, 0.0f, 0.0f));
+ }
+}
+
void InteractiveState::Exit() {
save.Write(player);
master.Quit();