From 20d0aa0c2309ac346fdf69d5e29d0fa814823d86 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 19 Mar 2018 23:49:21 +0100 Subject: [PATCH 1/4] Core/Maps: synch phasing with latest PR state. Fixes a instance map crash --- src/server/game/Maps/Map.cpp | 25 ++++++++++++++++++++++--- src/server/game/Maps/Map.h | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 08c3d399c47..3a380be38db 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -67,7 +67,7 @@ Map::~Map() if (!m_scriptSchedule.empty()) sMapMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size()); - if (m_parentMap != this) + if (m_parentMap == this) delete m_childTerrainMaps; MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(GetId(), i_InstanceId); @@ -670,6 +670,7 @@ bool Map::AddToMap(Transport* obj) { UpdateData data(GetId()); obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); + itr->GetSource()->m_visibleTransports.insert(obj->GetGUID()); WorldPacket packet; data.BuildPacket(&packet); itr->GetSource()->SendDirectMessage(&packet); @@ -968,8 +969,13 @@ void Map::RemoveFromMap(Transport* obj, bool remove) WorldPacket packet; data.BuildPacket(&packet); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { if (itr->GetSource()->GetTransport() != obj) + { itr->GetSource()->SendDirectMessage(&packet); + itr->GetSource()->m_visibleTransports.erase(obj->GetGUID()); + } + } } if (_transportsUpdateIter != _transports.end()) @@ -2295,6 +2301,12 @@ GridMap* Map::GetGrid(uint32 mapId, float x, float y) return grid; } +bool Map::HasGrid(uint32 mapId, int32 gx, int32 gy) const +{ + auto childMapItr = std::find_if(m_childTerrainMaps->begin(), m_childTerrainMaps->end(), [mapId](Map* childTerrainMap) { return childTerrainMap->GetId() == mapId; }); + return childMapItr != m_childTerrainMaps->end() && (*childMapItr)->GridMaps[gx][gy] && (*childMapItr)->GridMaps[gx][gy]->fileExists(); +} + float Map::GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y, float z, float* ground /*= nullptr*/, bool /*swim = false*/) const { if (const_cast(this)->GetGrid(x, y)) @@ -2824,13 +2836,20 @@ void Map::SendUpdateTransportVisibility(Player* player) UpdateData transData(player->GetMapId()); for (Transport* transport : _transports) { + auto transportItr = player->m_visibleTransports.find(transport->GetGUID()); if (player->IsInPhase(transport)) { - if (player->m_visibleTransports.find(transport->GetGUID()) == player->m_visibleTransports.end()) + if (transportItr == player->m_visibleTransports.end()) + { transport->BuildCreateUpdateBlockForPlayer(&transData, player); + player->m_visibleTransports.insert(transport->GetGUID()); + } } - else if (player->m_visibleTransports.find(transport->GetGUID()) != player->m_visibleTransports.end()) + else if (transportItr != player->m_visibleTransports.end()) + { transport->BuildOutOfRangeUpdateBlock(&transData); + player->m_visibleTransports.erase(transportItr); + } } WorldPacket packet; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index b9f7d5a9d62..5eb6502032a 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -350,7 +350,7 @@ class TC_GAME_API Map : public GridRefManager time_t GetGridExpiry(void) const { return i_gridExpiry; } uint32 GetId(void) const { return i_mapEntry->MapID; } - bool HasGrid(int32 gx, int32 gy) const { return GridMaps[gx][gy] && GridMaps[gx][gy]->fileExists(); } + bool HasGrid(uint32 mapId, int32 gx, int32 gy) const; static bool ExistMap(uint32 mapid, int gx, int gy); static bool ExistVMap(uint32 mapid, int gx, int gy); From 1583ae45a4a5e22159097ab9d73812aeb5b0be12 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 19 Mar 2018 23:56:58 +0100 Subject: [PATCH 2/4] Core/Phasing: fixed build --- src/server/game/Phasing/PhasingHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index 8b9e8843db5..bd65b93175a 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -516,7 +516,7 @@ uint32 PhasingHandler::GetTerrainMapId(PhaseShift const& phaseShift, Map const* for (auto itr = phaseShift.VisibleMapIds.rbegin(); itr != phaseShift.VisibleMapIds.rend(); ++itr) for (int32 gxi = gxbegin; gxi < gxend; ++gxi) for (int32 gyi = gybegin; gyi < gyend; ++gyi) - if (map->HasGrid(gxi, gyi)) + if (map->HasGrid(itr->first, gxi, gyi)) return itr->first; return map->GetId(); From 7ea9695868f1e200709e4a2b73d1571798d1fffe Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 19 Mar 2018 23:59:50 +0100 Subject: [PATCH 3/4] Core/Player: fixed an db layout issue that was causing corrupted pvp kill counters --- src/server/game/Entities/Player/Player.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 051a15db216..abd947dcd98 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17331,9 +17331,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } _LoadCurrency(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CURRENCY)); - SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[40].GetUInt32()); - SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[41].GetUInt16()); - SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[42].GetUInt16()); + SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[45].GetUInt32()); + SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[46].GetUInt16()); + SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[47].GetUInt16()); _LoadBoundInstances(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES)); _LoadInstanceTimeRestrictions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES)); From b2bd434a04231f3e45816a3792a055f35c9de28e Mon Sep 17 00:00:00 2001 From: Aokromes Date: Tue, 20 Mar 2018 00:06:17 +0100 Subject: [PATCH 4/4] missing part --- sql/base/characters_database.sql | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index a61e0598866..434e8f5e059 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -497,6 +497,81 @@ LOCK TABLES `character_action` WRITE; /*!40000 ALTER TABLE `character_action` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `character_archaeology_completed` +-- + +DROP TABLE IF EXISTS `character_archaeology_completed`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `character_archaeology_completed` ( + `guid` int(10) unsigned NOT NULL, + `project` smallint(5) unsigned NOT NULL, + `time` int(10) NOT NULL, + `count` int(10) NOT NULL, + PRIMARY KEY (`guid`,`project`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_archaeology_completed` +-- + +LOCK TABLES `character_action` WRITE; +/*!40000 ALTER TABLE `character_archaeology_completed` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_archaeology_completed` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `character_archaeology_projects` +-- + +DROP TABLE IF EXISTS `character_archaeology_projects`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `character_archaeology_projects` ( + `guid` int(10) unsigned NOT NULL, + `branch` tinyint(3) unsigned NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`guid`,`branch`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_archaeology_projects` +-- + +LOCK TABLES `character_archaeology_projects` WRITE; +/*!40000 ALTER TABLE `character_archaeology_projects` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_archaeology_projects` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `character_archaeology_sites` +-- + +DROP TABLE IF EXISTS `character_archaeology_sites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `character_archaeology_sites` ( + `guid` int(10) unsigned NOT NULL, + `site` tinyint(3) unsigned NOT NULL, + `type` smallint(5) unsigned NOT NULL, + `finds` tinyint(3) unsigned NOT NULL, + PRIMARY KEY (`guid`,`site`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*Data for the table `character_archaeology_sites` */ +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_archaeology_sites` +-- + +LOCK TABLES `character_archaeology_sites` WRITE; +/*!40000 ALTER TABLE `character_archaeology_sites` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_archaeology_sites` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `character_arena_stats` --