[12054] Add grayard linking/ unlinking support

This commit is contained in:
stfx 2012-07-16 23:42:01 +02:00 committed by Schmoozerd
parent c9d98e8c96
commit 754634fe42
5 changed files with 61 additions and 42 deletions

View file

@ -4047,7 +4047,7 @@ bool ChatHandler::HandleLinkGraveCommand(char* args)
Team g_team; Team g_team;
if (!teamStr) if (!teamStr)
g_team = TEAM_NONE; g_team = TEAM_BOTH_ALLOWED;
else if (strncmp(teamStr, "horde", strlen(teamStr))==0) else if (strncmp(teamStr, "horde", strlen(teamStr))==0)
g_team = HORDE; g_team = HORDE;
else if (strncmp(teamStr, "alliance", strlen(teamStr))==0) else if (strncmp(teamStr, "alliance", strlen(teamStr))==0)
@ -4056,7 +4056,6 @@ bool ChatHandler::HandleLinkGraveCommand(char* args)
return false; return false;
WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id); WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id);
if (!graveyard ) if (!graveyard )
{ {
PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, g_id); PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, g_id);
@ -4068,10 +4067,10 @@ bool ChatHandler::HandleLinkGraveCommand(char* args)
uint32 zoneId = player->GetZoneId(); uint32 zoneId = player->GetZoneId();
AreaTableEntry const *areaEntry = GetAreaEntryByAreaID(zoneId); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId);
if (!areaEntry || areaEntry->zone !=0) if (!areaEntry || areaEntry->zone !=0)
{ {
PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, g_id,zoneId); PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, g_id, zoneId);
SetSentErrorMessage(true); SetSentErrorMessage(true);
return false; return false;
} }
@ -4091,7 +4090,7 @@ bool ChatHandler::HandleNearGraveCommand(char* args)
size_t argslen = strlen(args); size_t argslen = strlen(args);
if(!*args) if(!*args)
g_team = TEAM_NONE; g_team = TEAM_BOTH_ALLOWED;
else if (strncmp(args, "horde", argslen) == 0) else if (strncmp(args, "horde", argslen) == 0)
g_team = HORDE; g_team = HORDE;
else if (strncmp(args, "alliance", argslen) == 0) else if (strncmp(args, "alliance", argslen) == 0)
@ -4102,49 +4101,48 @@ bool ChatHandler::HandleNearGraveCommand(char* args)
Player* player = m_session->GetPlayer(); Player* player = m_session->GetPlayer();
uint32 zone_id = player->GetZoneId(); uint32 zone_id = player->GetZoneId();
WorldSafeLocsEntry const* graveyard = sObjectMgr.GetClosestGraveYard( WorldSafeLocsEntry const* graveyard = sObjectMgr.GetClosestGraveYard(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), g_team);
player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), g_team);
if(graveyard) if (graveyard)
{ {
uint32 g_id = graveyard->ID; uint32 g_id = graveyard->ID;
GraveYardData const* data = sObjectMgr.FindGraveYardData(g_id,zone_id); GraveYardData const* data = sObjectMgr.FindGraveYardData(g_id, zone_id);
if (!data) if (!data)
{ {
PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR,g_id); PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, g_id);
SetSentErrorMessage(true); SetSentErrorMessage(true);
return false; return false;
} }
g_team = data->team; std::string team_name;
std::string team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_NOTEAM); if (data->team == TEAM_BOTH_ALLOWED)
if(g_team == 0)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ANY); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ANY);
else if(g_team == HORDE) else if (data->team == HORDE)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_HORDE); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_HORDE);
else if(g_team == ALLIANCE) else if (data->team == ALLIANCE)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ALLIANCE); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ALLIANCE);
else // Actually, this case cannot happen
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_NOTEAM);
PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, g_id,team_name.c_str(),zone_id); PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, g_id, team_name.c_str(), zone_id);
} }
else else
{ {
std::string team_name; std::string team_name;
if(g_team == 0) if (g_team == TEAM_BOTH_ALLOWED)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ANY); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ANY);
else if(g_team == HORDE) else if (g_team == HORDE)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_HORDE); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_HORDE);
else if(g_team == ALLIANCE) else if (g_team == ALLIANCE)
team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ALLIANCE); team_name = GetMangosString(LANG_COMMAND_GRAVEYARD_ALLIANCE);
if(g_team == ~uint32(0)) if (g_team == TEAM_BOTH_ALLOWED)
PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id); PSendSysMessage(LANG_COMMAND_ZONENOGRAVEYARDS, zone_id);
else else
PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id,team_name.c_str()); PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str());
} }
return true; return true;

View file

@ -5267,7 +5267,7 @@ void ObjectMgr::LoadGraveyardZones()
continue; continue;
} }
if (team != TEAM_NONE && team != HORDE && team != ALLIANCE) if (team != TEAM_BOTH_ALLOWED && team != HORDE && team != ALLIANCE)
{ {
sLog.outErrorDb("Table `game_graveyard_zone` has record for non player faction (%u), skipped.", team); sLog.outErrorDb("Table `game_graveyard_zone` has record for non player faction (%u), skipped.", team);
continue; continue;
@ -5286,7 +5286,7 @@ void ObjectMgr::LoadGraveyardZones()
WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, Team team) WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, Team team)
{ {
// search for zone associated closest graveyard // search for zone associated closest graveyard
uint32 zoneId = sTerrainMgr.GetZoneId(MapId,x,y,z); uint32 zoneId = sTerrainMgr.GetZoneId(MapId, x, y, z);
// Simulate std. algorithm: // Simulate std. algorithm:
// found some graveyard associated to (ghost_zone,ghost_map) // found some graveyard associated to (ghost_zone,ghost_map)
@ -5322,16 +5322,13 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float
{ {
GraveYardData const& data = itr->second; GraveYardData const& data = itr->second;
// Checked on load
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(data.safeLocId); WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(data.safeLocId);
if(!entry)
{
sLog.outErrorDb("Table `game_graveyard_zone` has record for not existing graveyard (WorldSafeLocs.dbc id) %u, skipped.",data.safeLocId);
continue;
}
// skip enemy faction graveyard // skip enemy faction graveyard
// team == 0 case can be at call from .neargrave // team == TEAM_BOTH_ALLOWED case can be at call from .neargrave
if (data.team != TEAM_NONE && team != TEAM_NONE && data.team != team) // TEAM_INVALID != team for all teams
if (data.team != TEAM_BOTH_ALLOWED && data.team != team && team != TEAM_BOTH_ALLOWED)
continue; continue;
// find now nearest graveyard at other (continent) map // find now nearest graveyard at other (continent) map
@ -5411,7 +5408,7 @@ GraveYardData const* ObjectMgr::FindGraveYardData(uint32 id, uint32 zoneId) cons
bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, Team team, bool inDB) bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, Team team, bool inDB)
{ {
if(FindGraveYardData(id,zoneId)) if (FindGraveYardData(id, zoneId)) // This ensures that (safeLoc)Id, zoneId is unique in mGraveYardMap
return false; return false;
// add link to loaded data // add link to loaded data
@ -5419,18 +5416,39 @@ bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, Team team, bool inDB)
data.safeLocId = id; data.safeLocId = id;
data.team = team; data.team = team;
mGraveYardMap.insert(GraveYardMap::value_type(zoneId,data)); mGraveYardMap.insert(GraveYardMap::value_type(zoneId, data));
// add link to DB // add link to DB
if(inDB) if (inDB)
{ WorldDatabase.PExecuteLog("INSERT INTO game_graveyard_zone ( id,ghost_zone,faction) VALUES ('%u', '%u','%u')", id, zoneId, uint32(team));
WorldDatabase.PExecuteLog("INSERT INTO game_graveyard_zone ( id,ghost_zone,faction) "
"VALUES ('%u', '%u','%u')", id, zoneId, uint32(team));
}
return true; return true;
} }
void ObjectMgr::SetGraveYardLinkTeam(uint32 id, uint32 zoneId, Team team)
{
std::pair<GraveYardMap::iterator, GraveYardMap::iterator> bounds = mGraveYardMap.equal_range(zoneId);
for (GraveYardMap::iterator itr = bounds.first; itr != bounds.second; ++itr)
{
GraveYardData& data = itr->second;
// skip not matching safezone id
if (data.safeLocId != id)
continue;
data.team = team; // Validate link
return;
}
if (team == TEAM_INVALID)
return;
// Link expected but not exist.
sLog.outErrorDb("ObjectMgr::SetGraveYardLinkTeam called for safeLoc %u, zoneId &u, but no graveyard link for this found in database.", id, zoneId);
AddGraveYardLink(id, zoneId, team); // Add to prevent further error message and correct mechanismn
}
void ObjectMgr::LoadAreaTriggerTeleports() void ObjectMgr::LoadAreaTriggerTeleports()
{ {
mAreaTriggers.clear(); // need for reload case mAreaTriggers.clear(); // need for reload case

View file

@ -333,7 +333,7 @@ struct GraveYardData
uint32 safeLocId; uint32 safeLocId;
Team team; Team team;
}; };
typedef std::multimap<uint32, GraveYardData> GraveYardMap; typedef std::multimap<uint32 /*zoneId*/, GraveYardData> GraveYardMap;
typedef std::pair<GraveYardMap::const_iterator, GraveYardMap::const_iterator> GraveYardMapBounds; typedef std::pair<GraveYardMap::const_iterator, GraveYardMap::const_iterator> GraveYardMapBounds;
enum ConditionType enum ConditionType
@ -591,8 +591,9 @@ class ObjectMgr
GossipText const* GetGossipText(uint32 Text_ID) const; GossipText const* GetGossipText(uint32 Text_ID) const;
WorldSafeLocsEntry const *GetClosestGraveYard(float x, float y, float z, uint32 MapId, Team team); WorldSafeLocsEntry const* GetClosestGraveYard(float x, float y, float z, uint32 MapId, Team team);
bool AddGraveYardLink(uint32 id, uint32 zone, Team team, bool inDB = true); bool AddGraveYardLink(uint32 id, uint32 zone, Team team, bool inDB = true);
void SetGraveYardLinkTeam(uint32 id, uint32 zoneId, Team team);
void LoadGraveyardZones(); void LoadGraveyardZones();
GraveYardData const* FindGraveYardData(uint32 id, uint32 zone) const; GraveYardData const* FindGraveYardData(uint32 id, uint32 zone) const;

View file

@ -588,6 +588,8 @@ enum Language
enum Team enum Team
{ {
TEAM_NONE = 0, // used when team value unknown or not set, 0 is also meaning that can be used !team check TEAM_NONE = 0, // used when team value unknown or not set, 0 is also meaning that can be used !team check
TEAM_BOTH_ALLOWED = 0, // used when a check should evaluate true for both teams
TEAM_INVALID = 1, // used to invalidate some team depending checks (means not for both teams)
HORDE = 67, HORDE = 67,
ALLIANCE = 469, ALLIANCE = 469,
}; };

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "12053" #define REVISION_NR "12054"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__