mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 19:37:03 +00:00
[12054] Add grayard linking/ unlinking support
This commit is contained in:
parent
c9d98e8c96
commit
754634fe42
5 changed files with 61 additions and 42 deletions
|
|
@ -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)
|
||||
|
|
@ -4055,8 +4055,7 @@ bool ChatHandler::HandleLinkGraveCommand(char* args)
|
|||
else
|
||||
return false;
|
||||
|
||||
WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id);
|
||||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "12053"
|
||||
#define REVISION_NR "12054"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue