diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/map.lua b/code/ryzom/client/data/gamedev/interfaces_v3/map.lua
new file mode 100644
index 000000000..609d18b28
--- /dev/null
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/map.lua
@@ -0,0 +1,42 @@
+--
+-- custom maps
+--
+
+if (game==nil) then
+ game= {};
+end
+
+-- alternative textures for maps
+game.mapTextures = {}
+-- game.mapTextures["zorai_map.tga"] = "tryker_map.tga"
+
+-- register alternative texture for map
+function game:setAltMap(mapName, altMap)
+ self.mapTextures[mapName] = altMap
+end
+
+-- remove alternative map texture
+function game:removeAltMap(mapName)
+ self.mapTextures[mapName] = nil
+end
+
+-- map = getUI("ui:interface:map:content:map_content:actual_map")
+function game:onLoadMap(map)
+ -- debugInfo("onLoadMap(id=".. map.id ..", texture=".. map.texture ..")");
+
+ -- if alt view not enabled
+ if getDbProp("UI:VARIABLES:SHOW_ALT_MAP") == 0 or map:isIsland() then
+ return
+ end
+
+ local texture = map.texture
+ if self.mapTextures[texture] ~= nil then
+ -- debugInfo("-- using ".. self.mapTextures[texture] .." for " .. texture)
+ return self.mapTextures[texture]
+ end
+end
+
+-- register map overrride
+-- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga")
+
+
diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/map.xml b/code/ryzom/client/data/gamedev/interfaces_v3/map.xml
index 0f1ab111c..b93028b82 100644
--- a/code/ryzom/client/data/gamedev/interfaces_v3/map.xml
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/map.xml
@@ -2,6 +2,10 @@
+
+
+
+
diff --git a/code/ryzom/client/src/interface_v3/group_map.cpp b/code/ryzom/client/src/interface_v3/group_map.cpp
index e6cfcf824..9de74bcc7 100644
--- a/code/ryzom/client/src/interface_v3/group_map.cpp
+++ b/code/ryzom/client/src/interface_v3/group_map.cpp
@@ -38,6 +38,7 @@
#include "../sheet_manager.h" // for MaxNumPeopleInTeam
#include "../global.h"
#include "nel/gui/ctrl_quad.h"
+#include "nel/gui/lua_ihm.h"
//
#include "nel/misc/xml_auto_ptr.h"
#include "game_share/mission_desc.h"
@@ -403,6 +404,7 @@ CGroupMap::CGroupMap(const TCtorParam ¶m)
_MaxH = 2000;
//_MinW = 50;
_MapTF = NULL;
+ _MapTexture.clear();
_PlayerPosMaterial = NULL;
_PlayerPosTF = NULL;
_MapTexW = 0;
@@ -462,6 +464,8 @@ CGroupMap::CGroupMap(const TCtorParam ¶m)
_PanStartDateInMs = 0;
_DeltaTimeBeforePanInMs = 0;
_DeltaPosBeforePan = 0;
+ //
+ _LuaLoadMapEntered = false;
}
//============================================================================================================
@@ -2070,16 +2074,62 @@ void CGroupMap::loadPlayerPos()
_PlayerPosMaterial.setTexture(_PlayerPosTF);
}
+//============================================================================================================
+void CGroupMap::reload()
+{
+ if (!_CurMap || !getActive()) return;
+
+ SMap* current = _CurMap;
+ _CurMap = NULL;
+
+ setMap(current);
+}
+
//============================================================================================================
void CGroupMap::loadMap()
{
_MapLoadFailure = true;
if (!_CurMap) return;
- const std::string &mapName = _CurMap->BitmapName;
- std::string fullName = NLMISC::CPath::lookup(mapName, false, false);
+
+ _MapTexture = _CurMap->BitmapName;
+
+ // call lua game:onLoadMap() function if present
+ // avoid deadlock if called recursively
+ if (!_LuaLoadMapEntered)
+ {
+ _LuaLoadMapEntered = true;
+ CLuaState *ls = CLuaManager::getInstance().getLuaState();
+
+ CLuaStackRestorer lsr(ls, ls->getTop());
+ ls->pushGlobalTable();
+
+ CLuaObject game(*ls);
+ game = game["game"];
+ if (!game["onLoadMap"].isNil())
+ {
+ uint numArg = 1;
+ uint numResult = 1;
+
+ CLuaIHM::pushReflectableOnStack(*ls, this);
+ if (game.callMethodByNameNoThrow("onLoadMap", numArg, numResult))
+ {
+ if (ls->isString(1))
+ {
+ if (!NLMISC::CPath::lookup(ls->toString(1), false, false).empty())
+ _MapTexture = ls->toString(1);
+ else
+ nlwarning("Custom map texture not found '%s' for map '%s'", ls->toString(1), _MapTexture.c_str());
+ }
+ }
+ }
+
+ _LuaLoadMapEntered = false;
+ }
+
+ std::string fullName = NLMISC::CPath::lookup(_MapTexture, false, false);
if (fullName.empty())
{
- nlwarning("Can't find map %s", mapName.c_str());
+ nlwarning("Can't find map %s", _MapTexture.c_str());
return;
}
uint32 w, h;
@@ -2098,7 +2148,7 @@ void CGroupMap::loadMap()
}
else
{
- nlwarning("Can't open map %s", mapName.c_str());
+ nlwarning("Can't open map %s", _MapTexture.c_str());
return;
}
_MapTF = Driver->createTextureFile(fullName);
@@ -3322,6 +3372,36 @@ SMap *CGroupMap::getParentMap(SMap *map)
return NULL;
}
+//=========================================================================================================
+std::string CGroupMap::getContinentName() const
+{
+ if (_CurMap == NULL) return "";
+
+ return toLower(_CurMap->ContinentName);
+}
+
+//=========================================================================================================
+std::string CGroupMap::getMapTexture() const
+{
+ return toLower(_MapTexture);
+}
+
+//=========================================================================================================
+int CGroupMap::luaReload(CLuaState &ls)
+{
+ CLuaIHM::checkArgCount(ls, "reload", 0);
+ reload();
+ return 0;
+}
+
+//=========================================================================================================
+int CGroupMap::luaIsIsland(CLuaState &ls)
+{
+ CLuaIHM::checkArgCount(ls, "isIsland", 0);
+ ls.push(_IsIsland);
+ return 1;
+}
+
/////////////////////
// ACTION HANDLERS //
diff --git a/code/ryzom/client/src/interface_v3/group_map.h b/code/ryzom/client/src/interface_v3/group_map.h
index 52980c0d8..baf273779 100644
--- a/code/ryzom/client/src/interface_v3/group_map.h
+++ b/code/ryzom/client/src/interface_v3/group_map.h
@@ -114,6 +114,17 @@ public:
*/
virtual void onUpdate(CGroupMap &/* owner */) {}
};
+
+ REFLECT_EXPORT_START(CGroupMap, CInterfaceGroup)
+ REFLECT_STRING("continent", getContinentName, dummySet);
+ REFLECT_STRING("texture", getMapTexture, dummySet);
+ REFLECT_LUA_METHOD("isIsland", luaIsIsland);
+ REFLECT_LUA_METHOD("reload", luaReload);
+ REFLECT_EXPORT_END
+
+ int luaReload(CLuaState &ls);
+ int luaIsIsland(CLuaState &ls);
+
public:
CGroupMap(const TCtorParam ¶m);
virtual ~CGroupMap();
@@ -134,6 +145,14 @@ public:
void setMap(const std::string &mapName);
void setMap(SMap *map);
+ // return current continent
+ std::string getContinentName() const;
+ // return currently displayed map texture
+ std::string getMapTexture() const;
+
+ // reload current map texture
+ void reload();
+
// pan the map of the given number of pixels
void pan(sint32 dx, sint32 dy);
@@ -323,6 +342,7 @@ private:
CContinent *_CurContinent; // the last continent for which the map was displayed (can be NULL if world)
NLMISC::CVector2f _MapMinCorner; // In world coordinates
NLMISC::CVector2f _MapMaxCorner;
+ std::string _MapTexture; // currently displayed map texture
bool _IsIsland; // true if current map is an island (island bitmap need not to be raised to the next
// power of 2
@@ -499,6 +519,8 @@ private:
// r2 islands
std::vector _Islands;
+ // guard against recursive calls
+ bool _LuaLoadMapEntered;
private:
void loadPlayerPos();
diff --git a/code/ryzom/client/src/interface_v3/register_interface_elements.cpp b/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
index 6ce0029bf..203cac03a 100644
--- a/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
+++ b/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
@@ -34,6 +34,7 @@ void registerInterfaceElements()
CViewPointerRyzom::forceLinking();
REGISTER_REFLECTABLE_CLASS(CViewRadar, CViewBase);
+ REGISTER_REFLECTABLE_CLASS(CGroupMap, CInterfaceGroup);
REGISTER_REFLECTABLE_CLASS(CDBCtrlSheet, CCtrlDraggable);
REGISTER_REFLECTABLE_CLASS(IListSheetBase, CInterfaceGroup);
REGISTER_REFLECTABLE_CLASS(CInterface3DScene, CInterfaceGroup);