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

View file

@ -5267,7 +5267,7 @@ void ObjectMgr::LoadGraveyardZones()
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);
continue;
@ -5286,7 +5286,7 @@ void ObjectMgr::LoadGraveyardZones()
WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, Team team)
{
// 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:
// 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;
// Checked on load
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
// team == 0 case can be at call from .neargrave
if (data.team != TEAM_NONE && team != TEAM_NONE && data.team != team)
// team == TEAM_BOTH_ALLOWED case can be at call from .neargrave
// TEAM_INVALID != team for all teams
if (data.team != TEAM_BOTH_ALLOWED && data.team != team && team != TEAM_BOTH_ALLOWED)
continue;
// 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)
{
if(FindGraveYardData(id,zoneId))
if (FindGraveYardData(id, zoneId)) // This ensures that (safeLoc)Id, zoneId is unique in mGraveYardMap
return false;
// add link to loaded data
@ -5419,18 +5416,39 @@ bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, Team team, bool inDB)
data.safeLocId = id;
data.team = team;
mGraveYardMap.insert(GraveYardMap::value_type(zoneId,data));
mGraveYardMap.insert(GraveYardMap::value_type(zoneId, data));
// add link to DB
if(inDB)
{
WorldDatabase.PExecuteLog("INSERT INTO game_graveyard_zone ( id,ghost_zone,faction) "
"VALUES ('%u', '%u','%u')", id, zoneId, uint32(team));
}
if (inDB)
WorldDatabase.PExecuteLog("INSERT INTO game_graveyard_zone ( id,ghost_zone,faction) VALUES ('%u', '%u','%u')", id, zoneId, uint32(team));
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()
{
mAreaTriggers.clear(); // need for reload case

View file

@ -333,7 +333,7 @@ struct GraveYardData
uint32 safeLocId;
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;
enum ConditionType
@ -591,8 +591,9 @@ class ObjectMgr
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);
void SetGraveYardLinkTeam(uint32 id, uint32 zoneId, Team team);
void LoadGraveyardZones();
GraveYardData const* FindGraveYardData(uint32 id, uint32 zone) const;

View file

@ -588,6 +588,8 @@ enum Language
enum Team
{
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,
ALLIANCE = 469,
};

View file

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