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);