mirror of
https://github.com/minetest/minetest.git
synced 2024-08-19 04:54:18 +02:00
[CSM] Add minimap API modifiers (#5399)
* Rename Mapper (too generic) to Minimap * Add lua functions to get/set position, angle, mode for minimap * Client: rename m_mapper to m_minimap * Add minimap to core.ui namespace (core.ui.minimap) * Add various functions to manage minimap (show, hide, toggle_shape) * Cleanup trivial declaration in client
This commit is contained in:
parent
eb88e5dd4b
commit
40ce538aad
@ -47,9 +47,21 @@ core.register_chatcommand("test_node", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local function preview_minimap()
|
||||||
|
local minimap = core.ui.minimap
|
||||||
|
minimap:show()
|
||||||
|
minimap:set_mode(4)
|
||||||
|
minimap:set_pos({x=5, y=50, z=5})
|
||||||
|
minimap:toggle_shape()
|
||||||
|
|
||||||
|
print("[PREVIEW] Minimap: mode => " .. dump(minimap:get_mode()) ..
|
||||||
|
" position => " .. dump(minimap:get_pos()) ..
|
||||||
|
" angle => " .. dump(minimap:get_angle()))
|
||||||
|
end
|
||||||
|
|
||||||
core.after(2, function()
|
core.after(2, function()
|
||||||
print("[PREVIEW] loaded " .. modname .. " mod")
|
print("[PREVIEW] loaded " .. modname .. " mod")
|
||||||
|
preview_minimap()
|
||||||
modstorage:set_string("current_mod", modname)
|
modstorage:set_string("current_mod", modname)
|
||||||
print(modstorage:get_string("current_mod"))
|
print(modstorage:get_string("current_mod"))
|
||||||
end)
|
end)
|
||||||
|
@ -789,9 +789,27 @@ Call these functions only at load time!
|
|||||||
* same as fgettext_ne(), but calls core.formspec_escape before returning result
|
* same as fgettext_ne(), but calls core.formspec_escape before returning result
|
||||||
* `show_formspec(formname, formspec)` : returns true on success
|
* `show_formspec(formname, formspec)` : returns true on success
|
||||||
* Shows a formspec to the player
|
* Shows a formspec to the player
|
||||||
|
|
||||||
|
### UI
|
||||||
|
* `minetest.ui.minimap`
|
||||||
|
* Reference to the minimap object. See `Minimap` class reference for methods.
|
||||||
|
|
||||||
Class reference
|
Class reference
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
### `Minimap`
|
||||||
|
An interface to manipulate minimap on client UI
|
||||||
|
|
||||||
|
* `show()`: shows the minimap (if not disabled by server)
|
||||||
|
* `hide()`: hides the minimap
|
||||||
|
* `set_pos(pos)`: sets the minimap position on screen
|
||||||
|
* `get_pos()`: returns the minimap current position
|
||||||
|
* `set_angle(deg)`: sets the minimap angle in degrees
|
||||||
|
* `get_angle()`: returns the current minimap angle in degrees
|
||||||
|
* `set_mode(mode)`: sets the minimap mode (0 to 6)
|
||||||
|
* `get_mode()`: returns the current minimap mode
|
||||||
|
* `toggle_shape()`: toggles minimap shape to round or square.
|
||||||
|
|
||||||
### `Settings`
|
### `Settings`
|
||||||
An interface to read config files in the format of `minetest.conf`.
|
An interface to read config files in the format of `minetest.conf`.
|
||||||
|
|
||||||
|
@ -224,6 +224,7 @@ Client::Client(
|
|||||||
m_device(device),
|
m_device(device),
|
||||||
m_camera(NULL),
|
m_camera(NULL),
|
||||||
m_minimap_disabled_by_server(false),
|
m_minimap_disabled_by_server(false),
|
||||||
|
m_minimap_shown_by_mod(false),
|
||||||
m_server_ser_ver(SER_FMT_VER_INVALID),
|
m_server_ser_ver(SER_FMT_VER_INVALID),
|
||||||
m_proto_ver(0),
|
m_proto_ver(0),
|
||||||
m_playeritem(0),
|
m_playeritem(0),
|
||||||
@ -255,7 +256,7 @@ Client::Client(
|
|||||||
// Add local player
|
// Add local player
|
||||||
m_env.setLocalPlayer(new LocalPlayer(this, playername));
|
m_env.setLocalPlayer(new LocalPlayer(this, playername));
|
||||||
|
|
||||||
m_mapper = new Mapper(device, this);
|
m_minimap = new Minimap(device, this);
|
||||||
m_cache_save_interval = g_settings->getU16("server_map_save_interval");
|
m_cache_save_interval = g_settings->getU16("server_map_save_interval");
|
||||||
|
|
||||||
m_cache_smooth_lighting = g_settings->getBool("smooth_lighting");
|
m_cache_smooth_lighting = g_settings->getBool("smooth_lighting");
|
||||||
@ -386,7 +387,7 @@ Client::~Client()
|
|||||||
m_device->getSceneManager()->getMeshCache()->removeMesh(mesh);
|
m_device->getSceneManager()->getMeshCache()->removeMesh(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete m_mapper;
|
delete m_minimap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::connect(Address address,
|
void Client::connect(Address address,
|
||||||
@ -636,7 +637,7 @@ void Client::step(float dtime)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (do_mapper_update)
|
if (do_mapper_update)
|
||||||
m_mapper->addBlock(r.p, minimap_mapblock);
|
m_minimap->addBlock(r.p, minimap_mapblock);
|
||||||
|
|
||||||
if (r.ack_block_to_server) {
|
if (r.ack_block_to_server) {
|
||||||
/*
|
/*
|
||||||
@ -1859,23 +1860,17 @@ void Client::afterContentReceived(IrrlichtDevice *device)
|
|||||||
delete[] text;
|
delete[] text;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Client::getRTT(void)
|
float Client::getRTT()
|
||||||
{
|
{
|
||||||
return m_con.getPeerStat(PEER_ID_SERVER,con::AVG_RTT);
|
return m_con.getPeerStat(PEER_ID_SERVER,con::AVG_RTT);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Client::getCurRate(void)
|
float Client::getCurRate()
|
||||||
{
|
{
|
||||||
return ( m_con.getLocalStat(con::CUR_INC_RATE) +
|
return ( m_con.getLocalStat(con::CUR_INC_RATE) +
|
||||||
m_con.getLocalStat(con::CUR_DL_RATE));
|
m_con.getLocalStat(con::CUR_DL_RATE));
|
||||||
}
|
}
|
||||||
|
|
||||||
float Client::getAvgRate(void)
|
|
||||||
{
|
|
||||||
return ( m_con.getLocalStat(con::AVG_INC_RATE) +
|
|
||||||
m_con.getLocalStat(con::AVG_DL_RATE));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::makeScreenshot(IrrlichtDevice *device)
|
void Client::makeScreenshot(IrrlichtDevice *device)
|
||||||
{
|
{
|
||||||
irr::video::IVideoDriver *driver = device->getVideoDriver();
|
irr::video::IVideoDriver *driver = device->getVideoDriver();
|
||||||
@ -1935,6 +1930,15 @@ void Client::makeScreenshot(IrrlichtDevice *device)
|
|||||||
raw_image->drop();
|
raw_image->drop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Client::shouldShowMinimap() const
|
||||||
|
{
|
||||||
|
if (m_minimap_disabled_by_server) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_minimap_shown_by_mod;
|
||||||
|
}
|
||||||
|
|
||||||
// IGameDef interface
|
// IGameDef interface
|
||||||
// Under envlock
|
// Under envlock
|
||||||
IItemDefManager* Client::getItemDefManager()
|
IItemDefManager* Client::getItemDefManager()
|
||||||
|
21
src/client.h
21
src/client.h
@ -49,7 +49,7 @@ struct MapDrawControl;
|
|||||||
class MtEventManager;
|
class MtEventManager;
|
||||||
struct PointedThing;
|
struct PointedThing;
|
||||||
class Database;
|
class Database;
|
||||||
class Mapper;
|
class Minimap;
|
||||||
struct MinimapMapblock;
|
struct MinimapMapblock;
|
||||||
class Camera;
|
class Camera;
|
||||||
class NetworkPacket;
|
class NetworkPacket;
|
||||||
@ -522,21 +522,17 @@ public:
|
|||||||
|
|
||||||
void afterContentReceived(IrrlichtDevice *device);
|
void afterContentReceived(IrrlichtDevice *device);
|
||||||
|
|
||||||
float getRTT(void);
|
float getRTT();
|
||||||
float getCurRate(void);
|
float getCurRate();
|
||||||
float getAvgRate(void);
|
|
||||||
|
|
||||||
Mapper* getMapper ()
|
Minimap* getMinimap() { return m_minimap; }
|
||||||
{ return m_mapper; }
|
void setCamera(Camera* camera) { m_camera = camera; }
|
||||||
|
|
||||||
void setCamera(Camera* camera)
|
|
||||||
{ m_camera = camera; }
|
|
||||||
|
|
||||||
Camera* getCamera ()
|
Camera* getCamera ()
|
||||||
{ return m_camera; }
|
{ return m_camera; }
|
||||||
|
|
||||||
bool isMinimapDisabledByServer()
|
bool shouldShowMinimap() const;
|
||||||
{ return m_minimap_disabled_by_server; }
|
void setMinimapShownByMod(bool state) { m_minimap_shown_by_mod = state; }
|
||||||
|
|
||||||
// IGameDef interface
|
// IGameDef interface
|
||||||
virtual IItemDefManager* getItemDefManager();
|
virtual IItemDefManager* getItemDefManager();
|
||||||
@ -636,8 +632,9 @@ private:
|
|||||||
con::Connection m_con;
|
con::Connection m_con;
|
||||||
IrrlichtDevice *m_device;
|
IrrlichtDevice *m_device;
|
||||||
Camera *m_camera;
|
Camera *m_camera;
|
||||||
Mapper *m_mapper;
|
Minimap *m_minimap;
|
||||||
bool m_minimap_disabled_by_server;
|
bool m_minimap_disabled_by_server;
|
||||||
|
bool m_minimap_shown_by_mod;
|
||||||
// Server serialization version
|
// Server serialization version
|
||||||
u8 m_server_ser_ver;
|
u8 m_server_ser_ver;
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ void draw_plain(Camera &camera, bool show_hud, Hud &hud,
|
|||||||
|
|
||||||
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
|
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
|
||||||
Camera &camera, Client& client, LocalPlayer *player, Hud &hud,
|
Camera &camera, Client& client, LocalPlayer *player, Hud &hud,
|
||||||
Mapper &mapper, gui::IGUIEnvironment *guienv,
|
Minimap &mapper, gui::IGUIEnvironment *guienv,
|
||||||
const v2u32 &screensize, const video::SColor &skycolor,
|
const v2u32 &screensize, const video::SColor &skycolor,
|
||||||
bool show_hud, bool show_minimap)
|
bool show_hud, bool show_minimap)
|
||||||
{
|
{
|
||||||
|
@ -32,7 +32,7 @@ void draw_load_screen(const std::wstring &text, IrrlichtDevice *device,
|
|||||||
|
|
||||||
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
|
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
|
||||||
Camera &camera, Client &client, LocalPlayer *player,
|
Camera &camera, Client &client, LocalPlayer *player,
|
||||||
Hud &hud, Mapper &mapper, gui::IGUIEnvironment *guienv,
|
Hud &hud, Minimap &mapper, gui::IGUIEnvironment *guienv,
|
||||||
const v2u32 &screensize, const video::SColor &skycolor,
|
const v2u32 &screensize, const video::SColor &skycolor,
|
||||||
bool show_hud, bool show_minimap);
|
bool show_hud, bool show_minimap);
|
||||||
|
|
||||||
|
@ -715,7 +715,7 @@ public:
|
|||||||
m_eye_position_vertex.set(eye_position_array, services);
|
m_eye_position_vertex.set(eye_position_array, services);
|
||||||
|
|
||||||
float minimap_yaw_array[3];
|
float minimap_yaw_array[3];
|
||||||
v3f minimap_yaw = m_client->getMapper()->getYawVec();
|
v3f minimap_yaw = m_client->getMinimap()->getYawVec();
|
||||||
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
|
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
|
||||||
minimap_yaw_array[0] = minimap_yaw.X;
|
minimap_yaw_array[0] = minimap_yaw.X;
|
||||||
minimap_yaw_array[1] = minimap_yaw.Y;
|
minimap_yaw_array[1] = minimap_yaw.Y;
|
||||||
@ -1473,7 +1473,7 @@ private:
|
|||||||
Sky *sky; // Free using ->Drop()
|
Sky *sky; // Free using ->Drop()
|
||||||
Inventory *local_inventory;
|
Inventory *local_inventory;
|
||||||
Hud *hud;
|
Hud *hud;
|
||||||
Mapper *mapper;
|
Minimap *mapper;
|
||||||
|
|
||||||
GameRunData runData;
|
GameRunData runData;
|
||||||
VolatileRunFlags flags;
|
VolatileRunFlags flags;
|
||||||
@ -1769,7 +1769,7 @@ void Game::run()
|
|||||||
updateProfilerGraphs(&graph);
|
updateProfilerGraphs(&graph);
|
||||||
|
|
||||||
// Update if minimap has been disabled by the server
|
// Update if minimap has been disabled by the server
|
||||||
flags.show_minimap &= !client->isMinimapDisabledByServer();
|
flags.show_minimap = client->shouldShowMinimap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2029,7 +2029,7 @@ bool Game::createClient(const std::string &playername,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper = client->getMapper();
|
mapper = client->getMinimap();
|
||||||
mapper->setMinimapMode(MINIMAP_MODE_OFF);
|
mapper->setMinimapMode(MINIMAP_MODE_OFF);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -184,7 +184,7 @@ void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height)
|
|||||||
//// Mapper
|
//// Mapper
|
||||||
////
|
////
|
||||||
|
|
||||||
Mapper::Mapper(IrrlichtDevice *device, Client *client)
|
Minimap::Minimap(IrrlichtDevice *device, Client *client)
|
||||||
{
|
{
|
||||||
this->client = client;
|
this->client = client;
|
||||||
this->driver = device->getVideoDriver();
|
this->driver = device->getVideoDriver();
|
||||||
@ -238,7 +238,7 @@ Mapper::Mapper(IrrlichtDevice *device, Client *client)
|
|||||||
m_minimap_update_thread->start();
|
m_minimap_update_thread->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
Mapper::~Mapper()
|
Minimap::~Minimap()
|
||||||
{
|
{
|
||||||
m_minimap_update_thread->stop();
|
m_minimap_update_thread->stop();
|
||||||
m_minimap_update_thread->wait();
|
m_minimap_update_thread->wait();
|
||||||
@ -258,17 +258,12 @@ Mapper::~Mapper()
|
|||||||
delete m_minimap_update_thread;
|
delete m_minimap_update_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::addBlock(v3s16 pos, MinimapMapblock *data)
|
void Minimap::addBlock(v3s16 pos, MinimapMapblock *data)
|
||||||
{
|
{
|
||||||
m_minimap_update_thread->enqueueBlock(pos, data);
|
m_minimap_update_thread->enqueueBlock(pos, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
MinimapMode Mapper::getMinimapMode()
|
void Minimap::toggleMinimapShape()
|
||||||
{
|
|
||||||
return data->mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mapper::toggleMinimapShape()
|
|
||||||
{
|
{
|
||||||
MutexAutoLock lock(m_mutex);
|
MutexAutoLock lock(m_mutex);
|
||||||
|
|
||||||
@ -277,7 +272,7 @@ void Mapper::toggleMinimapShape()
|
|||||||
m_minimap_update_thread->deferUpdate();
|
m_minimap_update_thread->deferUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::setMinimapMode(MinimapMode mode)
|
void Minimap::setMinimapMode(MinimapMode mode)
|
||||||
{
|
{
|
||||||
static const MinimapModeDef modedefs[MINIMAP_MODE_COUNT] = {
|
static const MinimapModeDef modedefs[MINIMAP_MODE_COUNT] = {
|
||||||
{false, 0, 0},
|
{false, 0, 0},
|
||||||
@ -302,7 +297,7 @@ void Mapper::setMinimapMode(MinimapMode mode)
|
|||||||
m_minimap_update_thread->deferUpdate();
|
m_minimap_update_thread->deferUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::setPos(v3s16 pos)
|
void Minimap::setPos(v3s16 pos)
|
||||||
{
|
{
|
||||||
bool do_update = false;
|
bool do_update = false;
|
||||||
|
|
||||||
@ -320,12 +315,12 @@ void Mapper::setPos(v3s16 pos)
|
|||||||
m_minimap_update_thread->deferUpdate();
|
m_minimap_update_thread->deferUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::setAngle(f32 angle)
|
void Minimap::setAngle(f32 angle)
|
||||||
{
|
{
|
||||||
m_angle = angle;
|
m_angle = angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::blitMinimapPixelsToImageRadar(video::IImage *map_image)
|
void Minimap::blitMinimapPixelsToImageRadar(video::IImage *map_image)
|
||||||
{
|
{
|
||||||
for (s16 x = 0; x < data->map_size; x++)
|
for (s16 x = 0; x < data->map_size; x++)
|
||||||
for (s16 z = 0; z < data->map_size; z++) {
|
for (s16 z = 0; z < data->map_size; z++) {
|
||||||
@ -339,7 +334,7 @@ void Mapper::blitMinimapPixelsToImageRadar(video::IImage *map_image)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::blitMinimapPixelsToImageSurface(
|
void Minimap::blitMinimapPixelsToImageSurface(
|
||||||
video::IImage *map_image, video::IImage *heightmap_image)
|
video::IImage *map_image, video::IImage *heightmap_image)
|
||||||
{
|
{
|
||||||
for (s16 x = 0; x < data->map_size; x++)
|
for (s16 x = 0; x < data->map_size; x++)
|
||||||
@ -368,7 +363,7 @@ void Mapper::blitMinimapPixelsToImageSurface(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
video::ITexture *Mapper::getMinimapTexture()
|
video::ITexture *Minimap::getMinimapTexture()
|
||||||
{
|
{
|
||||||
// update minimap textures when new scan is ready
|
// update minimap textures when new scan is ready
|
||||||
if (data->map_invalidated)
|
if (data->map_invalidated)
|
||||||
@ -418,7 +413,7 @@ video::ITexture *Mapper::getMinimapTexture()
|
|||||||
return data->texture;
|
return data->texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
v3f Mapper::getYawVec()
|
v3f Minimap::getYawVec()
|
||||||
{
|
{
|
||||||
if (data->minimap_shape_round) {
|
if (data->minimap_shape_round) {
|
||||||
return v3f(
|
return v3f(
|
||||||
@ -430,7 +425,7 @@ v3f Mapper::getYawVec()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scene::SMeshBuffer *Mapper::getMinimapMeshBuffer()
|
scene::SMeshBuffer *Minimap::getMinimapMeshBuffer()
|
||||||
{
|
{
|
||||||
scene::SMeshBuffer *buf = new scene::SMeshBuffer();
|
scene::SMeshBuffer *buf = new scene::SMeshBuffer();
|
||||||
buf->Vertices.set_used(4);
|
buf->Vertices.set_used(4);
|
||||||
@ -452,7 +447,7 @@ scene::SMeshBuffer *Mapper::getMinimapMeshBuffer()
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::drawMinimap()
|
void Minimap::drawMinimap()
|
||||||
{
|
{
|
||||||
video::ITexture *minimap_texture = getMinimapTexture();
|
video::ITexture *minimap_texture = getMinimapTexture();
|
||||||
if (!minimap_texture)
|
if (!minimap_texture)
|
||||||
@ -550,7 +545,7 @@ void Mapper::drawMinimap()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mapper::updateActiveMarkers ()
|
void Minimap::updateActiveMarkers()
|
||||||
{
|
{
|
||||||
video::IImage *minimap_mask = data->minimap_shape_round ?
|
video::IImage *minimap_mask = data->minimap_shape_round ?
|
||||||
data->minimap_mask_round : data->minimap_mask_square;
|
data->minimap_mask_round : data->minimap_mask_square;
|
||||||
|
@ -112,19 +112,21 @@ private:
|
|||||||
std::map<v3s16, MinimapMapblock *> m_blocks_cache;
|
std::map<v3s16, MinimapMapblock *> m_blocks_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Mapper {
|
class Minimap {
|
||||||
public:
|
public:
|
||||||
Mapper(IrrlichtDevice *device, Client *client);
|
Minimap(IrrlichtDevice *device, Client *client);
|
||||||
~Mapper();
|
~Minimap();
|
||||||
|
|
||||||
void addBlock(v3s16 pos, MinimapMapblock *data);
|
void addBlock(v3s16 pos, MinimapMapblock *data);
|
||||||
|
|
||||||
v3f getYawVec();
|
v3f getYawVec();
|
||||||
MinimapMode getMinimapMode();
|
|
||||||
|
|
||||||
void setPos(v3s16 pos);
|
void setPos(v3s16 pos);
|
||||||
|
v3s16 getPos() const { return data->pos; }
|
||||||
void setAngle(f32 angle);
|
void setAngle(f32 angle);
|
||||||
|
f32 getAngle() const { return m_angle; }
|
||||||
void setMinimapMode(MinimapMode mode);
|
void setMinimapMode(MinimapMode mode);
|
||||||
|
MinimapMode getMinimapMode() const { return data->mode; }
|
||||||
void toggleMinimapShape();
|
void toggleMinimapShape();
|
||||||
|
|
||||||
|
|
||||||
|
@ -1140,7 +1140,7 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)
|
|||||||
if (m_minimap_disabled_by_server && was_minimap_visible) {
|
if (m_minimap_disabled_by_server && was_minimap_visible) {
|
||||||
// defers a minimap update, therefore only call it if really
|
// defers a minimap update, therefore only call it if really
|
||||||
// needed, by checking that minimap was visible before
|
// needed, by checking that minimap was visible before
|
||||||
m_mapper->setMinimapMode(MINIMAP_MODE_OFF);
|
m_minimap->setMinimapMode(MINIMAP_MODE_OFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "cpp_api/s_internal.h"
|
#include "cpp_api/s_internal.h"
|
||||||
#include "lua_api/l_client.h"
|
#include "lua_api/l_client.h"
|
||||||
|
#include "lua_api/l_minimap.h"
|
||||||
#include "lua_api/l_storage.h"
|
#include "lua_api/l_storage.h"
|
||||||
#include "lua_api/l_sound.h"
|
#include "lua_api/l_sound.h"
|
||||||
#include "lua_api/l_util.h"
|
#include "lua_api/l_util.h"
|
||||||
@ -40,9 +41,14 @@ ClientScripting::ClientScripting(Client *client):
|
|||||||
lua_getglobal(L, "core");
|
lua_getglobal(L, "core");
|
||||||
int top = lua_gettop(L);
|
int top = lua_gettop(L);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_setfield(L, -2, "ui");
|
||||||
|
|
||||||
InitializeModApi(L, top);
|
InitializeModApi(L, top);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
|
LuaMinimap::create(L, client->getMinimap());
|
||||||
|
|
||||||
// Push builtin initialization type
|
// Push builtin initialization type
|
||||||
lua_pushstring(L, "client");
|
lua_pushstring(L, "client");
|
||||||
lua_setglobal(L, "INIT");
|
lua_setglobal(L, "INIT");
|
||||||
@ -59,4 +65,5 @@ void ClientScripting::InitializeModApi(lua_State *L, int top)
|
|||||||
|
|
||||||
LuaItemStack::Register(L);
|
LuaItemStack::Register(L);
|
||||||
StorageRef::Register(L);
|
StorageRef::Register(L);
|
||||||
|
LuaMinimap::Register(L);
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ set(common_SCRIPT_LUA_API_SRCS
|
|||||||
set(client_SCRIPT_LUA_API_SRCS
|
set(client_SCRIPT_LUA_API_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/l_client.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/l_client.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/l_mainmenu.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/l_mainmenu.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/l_minimap.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/l_sound.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/l_sound.cpp
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
|
196
src/script/lua_api/l_minimap.cpp
Normal file
196
src/script/lua_api/l_minimap.cpp
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2017 Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "lua_api/l_minimap.h"
|
||||||
|
#include "lua_api/l_internal.h"
|
||||||
|
#include "common/c_converter.h"
|
||||||
|
#include "minimap.h"
|
||||||
|
|
||||||
|
LuaMinimap::LuaMinimap(Minimap *m)
|
||||||
|
{
|
||||||
|
m_minimap = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LuaMinimap::create(lua_State *L, Minimap *m)
|
||||||
|
{
|
||||||
|
LuaMinimap *o = new LuaMinimap(m);
|
||||||
|
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
|
||||||
|
luaL_getmetatable(L, className);
|
||||||
|
lua_setmetatable(L, -2);
|
||||||
|
|
||||||
|
// Keep minimap object stack id
|
||||||
|
int minimap_object = lua_gettop(L);
|
||||||
|
|
||||||
|
lua_getglobal(L, "core");
|
||||||
|
lua_getfield(L, -1, "ui");
|
||||||
|
luaL_checktype(L, -1, LUA_TTABLE);
|
||||||
|
int uitable = lua_gettop(L);
|
||||||
|
|
||||||
|
lua_pushvalue(L, minimap_object); // Copy object to top of stack
|
||||||
|
lua_setfield(L, uitable, "minimap");
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_get_pos(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
push_v3s16(L, m->getPos());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_set_pos(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
m->setPos(read_v3s16(L, 2));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_get_angle(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
lua_pushinteger(L, m->getAngle());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_set_angle(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
m->setAngle(lua_tointeger(L, 2));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_get_mode(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
lua_pushinteger(L, m->getMinimapMode());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_set_mode(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
s32 mode = lua_tointeger(L, 2);
|
||||||
|
if (mode < MINIMAP_MODE_OFF ||
|
||||||
|
mode >= MINIMAP_MODE_COUNT) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m->setMinimapMode((MinimapMode) mode);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_toggle_shape(lua_State *L)
|
||||||
|
{
|
||||||
|
LuaMinimap *ref = checkobject(L, 1);
|
||||||
|
Minimap *m = getobject(ref);
|
||||||
|
|
||||||
|
m->toggleMinimapShape();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_show(lua_State *L)
|
||||||
|
{
|
||||||
|
Client *client = getClient(L);
|
||||||
|
assert(client);
|
||||||
|
client->setMinimapShownByMod(true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::l_hide(lua_State *L)
|
||||||
|
{
|
||||||
|
Client *client = getClient(L);
|
||||||
|
assert(client);
|
||||||
|
client->setMinimapShownByMod(false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
LuaMinimap *LuaMinimap::checkobject(lua_State *L, int narg)
|
||||||
|
{
|
||||||
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
|
||||||
|
luaL_checktype(L, narg, LUA_TUSERDATA);
|
||||||
|
|
||||||
|
void *ud = luaL_checkudata(L, narg, className);
|
||||||
|
if (!ud)
|
||||||
|
luaL_typerror(L, narg, className);
|
||||||
|
|
||||||
|
return *(LuaMinimap **)ud; // unbox pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimap* LuaMinimap::getobject(LuaMinimap *ref)
|
||||||
|
{
|
||||||
|
return ref->m_minimap;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaMinimap::gc_object(lua_State *L) {
|
||||||
|
LuaMinimap *o = *(LuaMinimap **)(lua_touserdata(L, 1));
|
||||||
|
delete o;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LuaMinimap::Register(lua_State *L)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
int methodtable = lua_gettop(L);
|
||||||
|
luaL_newmetatable(L, className);
|
||||||
|
int metatable = lua_gettop(L);
|
||||||
|
|
||||||
|
lua_pushliteral(L, "__metatable");
|
||||||
|
lua_pushvalue(L, methodtable);
|
||||||
|
lua_settable(L, metatable); // hide metatable from Lua getmetatable()
|
||||||
|
|
||||||
|
lua_pushliteral(L, "__index");
|
||||||
|
lua_pushvalue(L, methodtable);
|
||||||
|
lua_settable(L, metatable);
|
||||||
|
|
||||||
|
lua_pushliteral(L, "__gc");
|
||||||
|
lua_pushcfunction(L, gc_object);
|
||||||
|
lua_settable(L, metatable);
|
||||||
|
|
||||||
|
lua_pop(L, 1); // drop metatable
|
||||||
|
|
||||||
|
luaL_openlib(L, 0, methods, 0); // fill methodtable
|
||||||
|
lua_pop(L, 1); // drop methodtable
|
||||||
|
}
|
||||||
|
|
||||||
|
const char LuaMinimap::className[] = "Minimap";
|
||||||
|
const luaL_reg LuaMinimap::methods[] = {
|
||||||
|
luamethod(LuaMinimap, show),
|
||||||
|
luamethod(LuaMinimap, hide),
|
||||||
|
luamethod(LuaMinimap, get_pos),
|
||||||
|
luamethod(LuaMinimap, set_pos),
|
||||||
|
luamethod(LuaMinimap, get_angle),
|
||||||
|
luamethod(LuaMinimap, set_angle),
|
||||||
|
luamethod(LuaMinimap, get_mode),
|
||||||
|
luamethod(LuaMinimap, set_mode),
|
||||||
|
luamethod(LuaMinimap, toggle_shape),
|
||||||
|
{0,0}
|
||||||
|
};
|
64
src/script/lua_api/l_minimap.h
Normal file
64
src/script/lua_api/l_minimap.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2017 Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef L_MINIMAP_H_
|
||||||
|
#define L_MINIMAP_H_
|
||||||
|
|
||||||
|
#include "l_base.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Minimap;
|
||||||
|
|
||||||
|
class LuaMinimap : public ModApiBase {
|
||||||
|
private:
|
||||||
|
|
||||||
|
static const char className[];
|
||||||
|
static const luaL_reg methods[];
|
||||||
|
|
||||||
|
// garbage collector
|
||||||
|
static int gc_object(lua_State *L);
|
||||||
|
|
||||||
|
static int l_get_pos(lua_State *L);
|
||||||
|
static int l_set_pos(lua_State *L);
|
||||||
|
|
||||||
|
static int l_get_angle(lua_State *L);
|
||||||
|
static int l_set_angle(lua_State *L);
|
||||||
|
|
||||||
|
static int l_get_mode(lua_State *L);
|
||||||
|
static int l_set_mode(lua_State *L);
|
||||||
|
|
||||||
|
static int l_show(lua_State *L);
|
||||||
|
static int l_hide(lua_State *L);
|
||||||
|
|
||||||
|
static int l_toggle_shape(lua_State *L);
|
||||||
|
|
||||||
|
Minimap *m_minimap;
|
||||||
|
public:
|
||||||
|
LuaMinimap(Minimap *m);
|
||||||
|
~LuaMinimap() {}
|
||||||
|
|
||||||
|
static void create(lua_State *L, Minimap *object);
|
||||||
|
|
||||||
|
static LuaMinimap *checkobject(lua_State *L, int narg);
|
||||||
|
static Minimap* getobject(LuaMinimap *ref);
|
||||||
|
|
||||||
|
static void Register(lua_State *L);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // L_MINIMAP_H_
|
Loading…
Reference in New Issue
Block a user