aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/camera.h2
-rw-r--r--src/client/client.cpp2
-rw-r--r--src/client/content_cao.cpp27
-rw-r--r--src/client/content_cao.h4
-rw-r--r--src/client/minimap.cpp35
-rw-r--r--src/client/minimap.h11
6 files changed, 70 insertions, 11 deletions
diff --git a/src/client/camera.h b/src/client/camera.h
index 3a59637bc..16a1961be 100644
--- a/src/client/camera.h
+++ b/src/client/camera.h
@@ -169,8 +169,6 @@ public:
void removeNametag(Nametag *nametag);
- const std::list<Nametag *> &getNametags() { return m_nametags; }
-
void drawNametags();
inline void addArmInertia(f32 player_yaw);
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 0bd98b256..af69d0ec9 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -326,6 +326,8 @@ Client::~Client()
}
delete m_minimap;
+ m_minimap = nullptr;
+
delete m_media_downloader;
}
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp
index fae06554a..42184b08f 100644
--- a/src/client/content_cao.cpp
+++ b/src/client/content_cao.cpp
@@ -47,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <algorithm>
#include <cmath>
#include "client/shader.h"
+#include "client/minimap.h"
class Settings;
struct ToolCapabilities;
@@ -566,6 +567,9 @@ void GenericCAO::removeFromScene(bool permanent)
m_client->getCamera()->removeNametag(m_nametag);
m_nametag = nullptr;
}
+
+ if (m_marker && m_client->getMinimap())
+ m_client->getMinimap()->removeMarker(&m_marker);
}
void GenericCAO::addToScene(ITextureSource *tsrc)
@@ -794,6 +798,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
node->setParent(m_matrixnode);
updateNametag();
+ updateMarker();
updateNodePos();
updateAnimation();
updateBonePosition();
@@ -885,6 +890,23 @@ u16 GenericCAO::getLightPosition(v3s16 *pos)
return 3;
}
+void GenericCAO::updateMarker()
+{
+ if (!m_prop.show_on_minimap) {
+ if (m_marker)
+ m_client->getMinimap()->removeMarker(&m_marker);
+ return;
+ }
+
+ if (m_marker)
+ return;
+
+ scene::ISceneNode *node = getSceneNode();
+ if (!node)
+ return;
+ m_marker = m_client->getMinimap()->addMarker(node);
+}
+
void GenericCAO::updateNametag()
{
if (m_is_local_player) // No nametag for local player
@@ -1576,6 +1598,8 @@ void GenericCAO::processMessage(const std::string &data)
u8 cmd = readU8(is);
if (cmd == AO_CMD_SET_PROPERTIES) {
ObjectProperties newprops;
+ newprops.show_on_minimap = m_is_player; // default
+
newprops.deSerialize(is);
// Check what exactly changed
@@ -1609,6 +1633,8 @@ void GenericCAO::processMessage(const std::string &data)
if ((m_is_player && !m_is_local_player) && m_prop.nametag.empty())
m_prop.nametag = m_name;
+ if (m_is_local_player)
+ m_prop.show_on_minimap = false;
if (expire_visuals) {
expireVisuals();
@@ -1621,6 +1647,7 @@ void GenericCAO::processMessage(const std::string &data)
updateTextures(m_current_texture_modifier);
}
updateNametag();
+ updateMarker();
}
} else if (cmd == AO_CMD_UPDATE_POSITION) {
// Not sent by the server if this object is an attachment.
diff --git a/src/client/content_cao.h b/src/client/content_cao.h
index daf697767..435fc2931 100644
--- a/src/client/content_cao.h
+++ b/src/client/content_cao.h
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class Camera;
class Client;
struct Nametag;
+struct MinimapMarker;
/*
SmoothTranslator
@@ -84,6 +85,7 @@ private:
scene::IBillboardSceneNode *m_spritenode = nullptr;
scene::IDummyTransformationSceneNode *m_matrixnode = nullptr;
Nametag *m_nametag = nullptr;
+ MinimapMarker *m_marker = nullptr;
v3f m_position = v3f(0.0f, 10.0f * BS, 0);
v3f m_velocity;
v3f m_acceleration;
@@ -254,6 +256,8 @@ public:
void updateNametag();
+ void updateMarker();
+
void updateNodePos();
void step(float dtime, ClientEnvironment *env);
diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp
index 6bae408b4..d068ad5f7 100644
--- a/src/client/minimap.cpp
+++ b/src/client/minimap.cpp
@@ -252,6 +252,10 @@ Minimap::~Minimap()
driver->removeTexture(data->minimap_overlay_square);
driver->removeTexture(data->object_marker_red);
+ for (MinimapMarker *m : m_markers)
+ delete m;
+ m_markers.clear();
+
delete data;
delete m_minimap_update_thread;
}
@@ -678,21 +682,34 @@ void Minimap::drawMinimap(core::rect<s32> rect) {
}
}
+MinimapMarker* Minimap::addMarker(scene::ISceneNode *parent_node)
+{
+ MinimapMarker *m = new MinimapMarker(parent_node);
+ m_markers.push_back(m);
+ return m;
+}
+
+void Minimap::removeMarker(MinimapMarker **m)
+{
+ m_markers.remove(*m);
+ delete *m;
+ *m = nullptr;
+}
+
void Minimap::updateActiveMarkers()
{
video::IImage *minimap_mask = data->minimap_shape_round ?
data->minimap_mask_round : data->minimap_mask_square;
- const std::list<Nametag *> &nametags = client->getCamera()->getNametags();
-
m_active_markers.clear();
-
- for (Nametag *nametag : nametags) {
- v3s16 pos = floatToInt(nametag->parent_node->getAbsolutePosition() +
- intToFloat(client->getCamera()->getOffset(), BS), BS);
- pos -= data->pos - v3s16(data->mode.map_size / 2,
- data->mode.scan_height / 2,
- data->mode.map_size / 2);
+ v3f cam_offset = intToFloat(client->getCamera()->getOffset(), BS);
+ v3s16 pos_offset = data->pos - v3s16(data->mode.map_size / 2,
+ data->mode.scan_height / 2,
+ data->mode.map_size / 2);
+
+ for (MinimapMarker *marker : m_markers) {
+ v3s16 pos = floatToInt(marker->parent_node->getAbsolutePosition() +
+ cam_offset, BS) - pos_offset;
if (pos.X < 0 || pos.X > data->mode.map_size ||
pos.Y < 0 || pos.Y > data->mode.scan_height ||
pos.Z < 0 || pos.Z > data->mode.map_size) {
diff --git a/src/client/minimap.h b/src/client/minimap.h
index 11374b116..4a2c462f8 100644
--- a/src/client/minimap.h
+++ b/src/client/minimap.h
@@ -48,6 +48,13 @@ struct MinimapModeDef {
u16 scale;
};
+struct MinimapMarker {
+ MinimapMarker(scene::ISceneNode *parent_node):
+ parent_node(parent_node)
+ {
+ }
+ scene::ISceneNode *parent_node;
+};
struct MinimapPixel {
//! The topmost node that the minimap displays.
MapNode n;
@@ -142,6 +149,9 @@ public:
scene::SMeshBuffer *getMinimapMeshBuffer();
+ MinimapMarker* addMarker(scene::ISceneNode *parent_node);
+ void removeMarker(MinimapMarker **marker);
+
void updateActiveMarkers();
void drawMinimap();
void drawMinimap(core::rect<s32> rect);
@@ -162,5 +172,6 @@ private:
u16 m_surface_mode_scan_height;
f32 m_angle;
std::mutex m_mutex;
+ std::list<MinimapMarker*> m_markers;
std::list<v2f> m_active_markers;
};