Core/MMaps: use DisableMgr to disable pathfinding on a specific map

This commit is contained in:
joschiwald
2012-12-30 21:09:21 +01:00
parent 871f8c8003
commit 08f62d8313
8 changed files with 75 additions and 41 deletions

View File

@@ -0,0 +1,4 @@
DELETE FROM `command` WHERE `name` LIKE 'disable add mmap' OR `name` LIKE 'disable remove mmap';
INSERT INTO `command` (`name`, `security`, `help`) VALUES
('disable add mmap', '3', 'Syntax: .disable add mmap $entry $flag $comment'),
('disable remove mmap', '3', 'Syntax: .disable remove mmap $entry');

View File

@@ -19,7 +19,7 @@
#include "MMapFactory.h"
#include "World.h"
#include "Config.h"
#include <set>
#include "DisableMgr.h"
namespace MMAP
{
@@ -27,9 +27,6 @@ namespace MMAP
// our global singleton copy
MMapManager *g_MMapManager = NULL;
// stores list of mapids which do not use pathfinding
std::set<uint32>* g_mmapDisabledIds = NULL;
MMapManager* MMapFactory::createOrGetMMapManager()
{
if (g_MMapManager == NULL)
@@ -38,39 +35,14 @@ namespace MMAP
return g_MMapManager;
}
void MMapFactory::preventPathfindingOnMaps(const char* ignoreMapIds)
{
if (!g_mmapDisabledIds)
g_mmapDisabledIds = new std::set<uint32>();
uint32 strLenght = strlen(ignoreMapIds)+1;
char* mapList = new char[strLenght];
memcpy(mapList, ignoreMapIds, sizeof(char)*strLenght);
char* idstr = strtok(mapList, ",");
while (idstr)
{
g_mmapDisabledIds->insert(uint32(atoi(idstr)));
idstr = strtok(NULL, ",");
}
delete[] mapList;
}
bool MMapFactory::IsPathfindingEnabled(uint32 mapId)
{
return sWorld->getBoolConfig(CONFIG_ENABLE_MMAPS)
&& g_mmapDisabledIds->find(mapId) == g_mmapDisabledIds->end();
&& !DisableMgr::IsDisabledFor(DISABLE_TYPE_MMAP, mapId, NULL, MMAP_DISABLE_PATHFINDING);
}
void MMapFactory::clear()
{
if (g_mmapDisabledIds)
{
delete g_mmapDisabledIds;
g_mmapDisabledIds = NULL;
}
if (g_MMapManager)
{
delete g_MMapManager;

View File

@@ -42,7 +42,6 @@ namespace MMAP
public:
static MMapManager* createOrGetMMapManager();
static void clear();
static void preventPathfindingOnMaps(const char* ignoreMapIds);
static bool IsPathfindingEnabled(uint32 mapId);
};
}

View File

@@ -42,7 +42,7 @@ namespace
DisableMap m_DisableMap;
uint8 MAX_DISABLE_TYPES = 7;
uint8 MAX_DISABLE_TYPES = 8;
}
void LoadDisables()
@@ -222,6 +222,34 @@ void LoadDisables()
}
break;
}
case DISABLE_TYPE_MMAP:
{
MapEntry const* mapEntry = sMapStore.LookupEntry(entry);
if (!mapEntry)
{
sLog->outError(LOG_FILTER_SQL, "Map entry %u from `disables` doesn't exist in dbc, skipped.", entry);
continue;
}
switch (mapEntry->map_type)
{
case MAP_COMMON:
sLog->outInfo(LOG_FILTER_GENERAL, "Pathfinding disabled for world map %u.", entry);
break;
case MAP_INSTANCE:
case MAP_RAID:
sLog->outInfo(LOG_FILTER_GENERAL, "Pathfinding disabled for instance map %u.", entry);
break;
case MAP_BATTLEGROUND:
sLog->outInfo(LOG_FILTER_GENERAL, "Pathfinding disabled for battleground map %u.", entry);
break;
case MAP_ARENA:
sLog->outInfo(LOG_FILTER_GENERAL, "Pathfinding disabled for arena map %u.", entry);
break;
default:
break;
}
break;
}
default:
break;
}
@@ -348,6 +376,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags
case DISABLE_TYPE_BATTLEGROUND:
case DISABLE_TYPE_OUTDOORPVP:
case DISABLE_TYPE_ACHIEVEMENT_CRITERIA:
case DISABLE_TYPE_MMAP:
return true;
case DISABLE_TYPE_VMAP:
return flags & itr->second.flags;

View File

@@ -31,7 +31,8 @@ enum DisableType
DISABLE_TYPE_BATTLEGROUND = 3,
DISABLE_TYPE_ACHIEVEMENT_CRITERIA = 4,
DISABLE_TYPE_OUTDOORPVP = 5,
DISABLE_TYPE_VMAP = 6
DISABLE_TYPE_VMAP = 6,
DISABLE_TYPE_MMAP = 7
};
enum SpellDisableTypes
@@ -54,6 +55,11 @@ enum VmapDisableTypes
VMAP_DISABLE_LIQUIDSTATUS = 0x8
};
enum MMapDisableTypes
{
MMAP_DISABLE_PATHFINDING = 0x0
};
namespace DisableMgr
{
void LoadDisables();

View File

@@ -1134,7 +1134,6 @@ void World::LoadConfigSettings(bool reload)
m_bool_configs[CONFIG_ENABLE_MMAPS] = ConfigMgr::GetBoolDefault("mmap.enablePathFinding", true);
sLog->outInfo(LOG_FILTER_SERVER_LOADING, "WORLD: MMap data directory is: %smmaps", m_dataPath.c_str());
MMAP::MMapFactory::preventPathfindingOnMaps(ConfigMgr::GetStringDefault("mmap.ignoreMapIds", "").c_str());
m_bool_configs[CONFIG_VMAP_INDOOR_CHECK] = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", 0);
bool enableIndoor = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", true);

View File

@@ -48,6 +48,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableVmapCommand, "", NULL },
{ "mmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand addDisableCommandTable[] =
@@ -59,6 +60,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleAddDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleAddDisableVmapCommand, "", NULL },
{ "mmap", SEC_ADMINISTRATOR, true, &HandleAddDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand disableCommandTable[] =
@@ -172,6 +174,17 @@ public:
disableTypeStr = "vmap";
break;
}
case DISABLE_TYPE_MMAP:
{
if (!sMapStore.LookupEntry(entry))
{
handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND);
handler->SetSentErrorMessage(true);
return false;
}
disableTypeStr = "mmap";
break;
}
default:
break;
}
@@ -256,6 +269,14 @@ public:
return HandleAddDisables(handler, args, DISABLE_TYPE_VMAP);
}
static bool HandleAddDisableMMapCommand(ChatHandler* handler, char const* args)
{
if (!*args)
return false;
return HandleAddDisables(handler, args, DISABLE_TYPE_MMAP);
}
static bool HandleRemoveDisables(ChatHandler* handler, char const* args, uint8 disableType)
{
char* entryStr = strtok((char*)args, " ");
@@ -289,6 +310,9 @@ public:
case DISABLE_TYPE_VMAP:
disableTypeStr = "vmap";
break;
case DISABLE_TYPE_MMAP:
disableTypeStr = "mmap";
break;
}
PreparedStatement* stmt = NULL;
@@ -367,6 +391,14 @@ public:
return HandleRemoveDisables(handler, args, DISABLE_TYPE_VMAP);
}
static bool HandleRemoveDisableMMapCommand(ChatHandler* handler, char const* args)
{
if (!*args)
return false;
return HandleRemoveDisables(handler, args, DISABLE_TYPE_MMAP);
}
};
void AddSC_disable_commandscript()

View File

@@ -276,13 +276,6 @@ PlayerSave.Stats.SaveOnlyOnLogout = 1
mmap.enablePathFinding = 1
#
# mmap.ignoreMapIds
# Disable mmap pathfinding on the listed maps.
# List of map ids with delimiter ','
mmap.ignoreMapIds = ""
#
# vmap.enableLOS
# vmap.enableHeight