Cleanups in instance_template and map entrance DBC data.

This commit is contained in:
VladimirMangos 2010-04-17 14:55:30 +04:00
parent 43cc07fbbc
commit 48254e3879
7 changed files with 63 additions and 51 deletions

View file

@ -2036,10 +2036,6 @@ CREATE TABLE `instance_template` (
`parent` smallint(5) unsigned NOT NULL default '0', `parent` smallint(5) unsigned NOT NULL default '0',
`levelMin` tinyint(3) unsigned NOT NULL default '0', `levelMin` tinyint(3) unsigned NOT NULL default '0',
`levelMax` tinyint(3) unsigned NOT NULL default '0', `levelMax` tinyint(3) unsigned NOT NULL default '0',
`startLocX` float default NULL,
`startLocY` float default NULL,
`startLocZ` float default NULL,
`startLocO` float default NULL,
`script` varchar(128) NOT NULL default '', `script` varchar(128) NOT NULL default '',
PRIMARY KEY (`map`) PRIMARY KEY (`map`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

View file

@ -0,0 +1,5 @@
ALTER TABLE instance_template
DROP COLUMN startLocX,
DROP COLUMN startLocY,
DROP COLUMN startLocZ,
DROP COLUMN startLocO;

View file

@ -1108,9 +1108,9 @@ struct MapEntry
// 56 intro text flags // 56 intro text flags
uint32 multimap_id; // 57 index in LoadingScreens.dbc uint32 multimap_id; // 57 index in LoadingScreens.dbc
//float BattlefieldMapIconScale; // 58 BattlefieldMapIconScale //float BattlefieldMapIconScale; // 58 BattlefieldMapIconScale
int32 entrance_map; // 59 map_id of entrance map int32 ghost_entrance_map; // 59 map_id of entrance map in ghost mode (continent always and in most cases = normal entrance)
float entrance_x; // 60 entrance x coordinate (if exist single entry) float ghost_entrance_x; // 60 entrance x coordinate in ghost mode (in most cases = normal entrance)
float entrance_y; // 61 entrance y coordinate (if exist single entry) float ghost_entrance_y; // 61 entrance y coordinate in ghost mode (in most cases = normal entrance)
//uint32 timeOfDayOverride; // 62 time of day override //uint32 timeOfDayOverride; // 62 time of day override
uint32 addon; // 63 expansion uint32 addon; // 63 expansion
// 64 some kind of time? // 64 some kind of time?

View file

@ -189,14 +189,11 @@ public:
struct InstanceTemplate struct InstanceTemplate
{ {
uint32 map; uint32 map; // instance map
uint32 parent; uint32 parent; // non-continent parent instance (for instance with entrance in another instances)
// or 0 (not related to continent 0 map id)
uint32 levelMin; uint32 levelMin;
uint32 levelMax; uint32 levelMax;
float startLocX;
float startLocY;
float startLocZ;
float startLocO;
uint32 script_id; uint32 script_id;
}; };
@ -347,17 +344,6 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
bool IsBattleGround() const { return i_mapEntry && i_mapEntry->IsBattleGround(); } bool IsBattleGround() const { return i_mapEntry && i_mapEntry->IsBattleGround(); }
bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); } bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); }
bool IsBattleGroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattleGroundOrArena(); } bool IsBattleGroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattleGroundOrArena(); }
bool GetEntrancePos(int32 &mapid, float &x, float &y)
{
if(!i_mapEntry)
return false;
if(i_mapEntry->entrance_map < 0)
return false;
mapid = i_mapEntry->entrance_map;
x = i_mapEntry->entrance_x;
y = i_mapEntry->entrance_y;
return true;
}
void AddObjectToRemoveList(WorldObject *obj); void AddObjectToRemoveList(WorldObject *obj);

View file

@ -4676,17 +4676,42 @@ void ObjectMgr::LoadInstanceTemplate()
for(uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++) for(uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++)
{ {
InstanceTemplate* temp = (InstanceTemplate*)GetInstanceTemplate(i); InstanceTemplate const* temp = GetInstanceTemplate(i);
if(!temp) if (!temp)
continue; continue;
if(!MapManager::IsValidMAP(temp->map)) MapEntry const* mapEntry = sMapStore.LookupEntry(temp->map);
sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: bad mapid %d for template!", temp->map); if (!mapEntry)
if(!MapManager::IsValidMapCoord(temp->parent,temp->startLocX,temp->startLocY,temp->startLocZ,temp->startLocO))
{ {
sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: bad parent entrance coordinates for map id %d template!", temp->map); sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: bad mapid %d for template!", temp->map);
temp->parent = 0; // will have wrong continent 0 parent, at least existed sInstanceTemplate.EraseEntry(i);
continue;
}
if (mapEntry->IsContinent())
{
sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: continent mapid %d for template!", temp->map);
sInstanceTemplate.EraseEntry(i);
continue;
}
if (temp->parent > 0)
{
// check existence
MapEntry const* parentEntry = sMapStore.LookupEntry(temp->parent);
if (!parentEntry)
{
sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: bad parent map id for instance template %d template!", parentEntry,temp->map);
const_cast<InstanceTemplate*>(temp)->parent = 0;
continue;
}
if (parentEntry->IsContinent())
{
sLog.outErrorDb("ObjectMgr::LoadInstanceTemplate: parent point to continent map id %u for instance template %d template, ignored, need be set only for non-continent parents!", parentEntry->MapID,temp->map);
const_cast<InstanceTemplate*>(temp)->parent = 0;
continue;
}
} }
} }
@ -5349,23 +5374,23 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float
if(data.team != 0 && team != 0 && data.team != team) if(data.team != 0 && team != 0 && data.team != team)
continue; continue;
// find now nearest graveyard at other map // find now nearest graveyard at other (continent) map
if(MapId != entry->map_id) if(MapId != entry->map_id)
{ {
// if find graveyard at different map from where entrance placed (or no entrance data), use any first // if find graveyard at different map from where entrance placed (or no entrance data), use any first
if (!mapEntry || if (!mapEntry ||
mapEntry->entrance_map < 0 || mapEntry->ghost_entrance_map < 0 ||
mapEntry->entrance_map != entry->map_id || mapEntry->ghost_entrance_map != entry->map_id ||
(mapEntry->entrance_x == 0 && mapEntry->entrance_y == 0)) (mapEntry->ghost_entrance_x == 0 && mapEntry->ghost_entrance_y == 0))
{ {
// not have any corrdinates for check distance anyway // not have any coordinates for check distance anyway
entryFar = entry; entryFar = entry;
continue; continue;
} }
// at entrance map calculate distance (2D); // at entrance map calculate distance (2D);
float dist2 = (entry->x - mapEntry->entrance_x)*(entry->x - mapEntry->entrance_x) float dist2 = (entry->x - mapEntry->ghost_entrance_x)*(entry->x - mapEntry->ghost_entrance_x)
+(entry->y - mapEntry->entrance_y)*(entry->y - mapEntry->entrance_y); +(entry->y - mapEntry->ghost_entrance_y)*(entry->y - mapEntry->ghost_entrance_y);
if(foundEntr) if(foundEntr)
{ {
if(dist2 < distEntr) if(dist2 < distEntr)
@ -5586,18 +5611,18 @@ void ObjectMgr::LoadAreaTriggerTeleports()
} }
/* /*
* Searches for the areatrigger which teleports players out of the given map * Searches for the areatrigger which teleports players out of the given map (only direct to continent)
*/ */
AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 map_id) const
{ {
const MapEntry *mapEntry = sMapStore.LookupEntry(Map); const MapEntry *mapEntry = sMapStore.LookupEntry(map_id);
if(!mapEntry) return NULL; if(!mapEntry) return NULL;
for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr) for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr)
{ {
if(itr->second.target_mapId == mapEntry->entrance_map) if(itr->second.target_mapId == mapEntry->ghost_entrance_map)
{ {
AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first); AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
if(atEntry && atEntry->mapid == Map) if(atEntry && atEntry->mapid == map_id)
return &itr->second; return &itr->second;
} }
} }

View file

@ -293,14 +293,14 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/)
// search entrance map for proper show entrance // search entrance map for proper show entrance
if(MapEntry const* corpseMapEntry = sMapStore.LookupEntry(mapid)) if(MapEntry const* corpseMapEntry = sMapStore.LookupEntry(mapid))
{ {
if(corpseMapEntry->IsDungeon() && corpseMapEntry->entrance_map >= 0) if(corpseMapEntry->IsDungeon() && corpseMapEntry->ghost_entrance_map >= 0)
{ {
// if corpse map have entrance // if corpse map have entrance
if(Map const* entranceMap = sMapMgr.CreateBaseMap(corpseMapEntry->entrance_map)) if(Map const* entranceMap = sMapMgr.CreateBaseMap(corpseMapEntry->ghost_entrance_map))
{ {
mapid = corpseMapEntry->entrance_map; mapid = corpseMapEntry->ghost_entrance_map;
x = corpseMapEntry->entrance_x; x = corpseMapEntry->ghost_entrance_x;
y = corpseMapEntry->entrance_y; y = corpseMapEntry->ghost_entrance_y;
z = entranceMap->GetHeight(x, y, MAX_HEIGHT); z = entranceMap->GetHeight(x, y, MAX_HEIGHT);
} }
} }

View file

@ -36,8 +36,8 @@ const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiiii"; const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiiii";
const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiii"; const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiii";
const char PageTextfmt[]="isi"; const char PageTextfmt[]="isi";
const char InstanceTemplatesrcfmt[]="iiiiffffs"; const char InstanceTemplatesrcfmt[]="iiiis";
const char InstanceTemplatedstfmt[]="iiiiffffi"; const char InstanceTemplatedstfmt[]="iiiii";
SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template"); SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template");
SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon"); SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon");