diff --git a/data/sql/updates/pending_db_world/remove_charrace_dbc.sql b/data/sql/updates/pending_db_world/remove_charrace_dbc.sql new file mode 100644 index 000000000..888713226 --- /dev/null +++ b/data/sql/updates/pending_db_world/remove_charrace_dbc.sql @@ -0,0 +1,99 @@ +-- -------------------------------------------------------- +-- Host: 127.0.0.1 +-- Server version: 8.0.29 - MySQL Community Server - GPL +-- Server OS: Win64 +-- HeidiSQL Version: 12.0.0.6468 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- Dumping structure for table acore_world.chrraces_dbc +DROP TABLE IF EXISTS `chrraces_dbc`; +CREATE TABLE IF NOT EXISTS `chrraces_dbc` ( + `ID` int NOT NULL DEFAULT '0', + `Flags` int NOT NULL DEFAULT '0', + `FactionID` int NOT NULL DEFAULT '0', + `ExplorationSoundID` int NOT NULL DEFAULT '0', + `MaleDisplayId` int NOT NULL DEFAULT '0', + `FemaleDisplayId` int NOT NULL DEFAULT '0', + `ClientPrefix` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `BaseLanguage` int NOT NULL DEFAULT '0', + `CreatureType` int NOT NULL DEFAULT '0', + `ResSicknessSpellID` int NOT NULL DEFAULT '0', + `SplashSoundID` int NOT NULL DEFAULT '0', + `ClientFilestring` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `CinematicSequenceID` int NOT NULL DEFAULT '0', + `Alliance` int NOT NULL DEFAULT '0', + `Name_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `Name_Female_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `Name_Male_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `FacialHairCustomization_1` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `FacialHairCustomization_2` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `HairCustomization` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Required_Expansion` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Dumping data for table acore_world.chrraces_dbc: ~0 rows (approximately) +DELETE FROM `chrraces_dbc`; + +/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index dfc1e5dfe..4b2e18d08 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2258,7 +2258,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. - if (uint32 titleId = reward->titleId[achievement->ID == 1793 ? GetPlayer()->GetNativeGender() : (GetPlayer()->GetTeam() == ALLIANCE ? 0 : 1)]) + if (uint32 titleId = reward->titleId[achievement->ID == 1793 ? GetPlayer()->getGender() : uint8(GetPlayer()->GetTeamId())]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) GetPlayer()->SetTitle(titleEntry); @@ -2363,8 +2363,8 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID)) return false; - if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeamId() != TEAM_HORDE) || - (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeamId() != TEAM_ALLIANCE)) + if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeamId(true) != TEAM_HORDE) || + (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeamId(true) != TEAM_ALLIANCE)) return false; for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i) diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index cf319ba39..89f8848ab 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -1506,11 +1506,6 @@ struct WGWorkshop teamControl = team; break; } - case HORDE_FACTION: - case ALLIANCE_FACTION: - { - break; - } } if (!init) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 3f352526a..3723778ea 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -744,7 +744,7 @@ uint32 Battleground::GetRealRepFactionForPlayer(uint32 factionId, Player* player if (player) { // if the bg team is not the original team, reverse reputation - if (player->GetBgTeamId() != player->GetTeamId()) + if (player->GetBgTeamId() != player->GetTeamId(true)) { switch (factionId) { diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index a5e0e055c..dc326d784 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -144,7 +144,7 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* group, Battle ginfo->JoinTime = GameTime::GetGameTimeMS().count(); ginfo->RemoveInviteTime = 0; ginfo->teamId = leader->GetTeamId(); - ginfo->RealTeamID = leader->GetTeamId(); + ginfo->RealTeamID = leader->GetTeamId(true); ginfo->ArenaTeamRating = arenaRating; ginfo->ArenaMatchmakerRating = matchmakerRating; ginfo->PreviousOpponentsTeamId = opponentsArenaTeamId; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 98cad8ce2..ae21b5c76 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -431,7 +431,7 @@ namespace lfg { if (!itemRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { - if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == player->GetTeamId()) + if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == player->GetTeamId(true)) { if (!player->HasItemCount(itemRequirement->id, 1)) { @@ -447,7 +447,7 @@ namespace lfg { if (!questRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { - if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == player->GetTeamId()) + if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == player->GetTeamId(true)) { if (!player->GetQuestRewardStatus(questRequirement->id)) { @@ -469,7 +469,7 @@ namespace lfg { if (!achievementRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID()) { - if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == player->GetTeamId()) + if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == player->GetTeamId(true)) { if (!player->HasAchieved(achievementRequirement->id)) { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a19c4ed0f..af3df4f38 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -517,10 +517,9 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo return false; } - setRace(createInfo->Race); - setClass(createInfo->Class); - setGender(Gender(createInfo->Gender)); - setPowerType(Powers(powertype), false); + uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16); + + SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24))); InitDisplayIds(); if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP) { @@ -725,7 +724,7 @@ bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount) } // item can't be added - LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(), getClass(), msg); + LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg); return false; } @@ -2225,7 +2224,7 @@ void Player::SetGameMaster(bool on) SetPhaseMask(newPhase, false); m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON; - SetFactionForRace(getRace()); + SetFactionForRace(getRace(true)); RemovePlayerFlag(PLAYER_FLAGS_GM); RemoveUnitFlag2(UNIT_FLAG2_ALLOW_CHEAT_SPELLS); @@ -2436,7 +2435,7 @@ void Player::GiveLevel(uint8 level) guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level); PlayerLevelInfo info; - sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), level, &info); + sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info); PlayerClassLevelInfo classInfo; sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo); @@ -2552,7 +2551,7 @@ void Player::InitStatsForLevel(bool reapplyMods) sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo); PlayerLevelInfo info; - sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), GetLevel(), &info); + sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info); uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); sScriptMgr->OnSetMaxLevel(this, maxPlayerLevel); @@ -4339,7 +4338,7 @@ void Player::BuildPlayerRepop() WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); data << GetPackGUID(); GetSession()->SendPacket(&data); - if (getRace() == RACE_NIGHTELF) + if (getRace(true) == RACE_NIGHTELF) { CastSpell(this, 20584, true); } @@ -5743,19 +5742,19 @@ TeamId Player::TeamIdForRace(uint8 race) { if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race)) { - switch (rEntry->BaseLanguage) + switch (rEntry->TeamID) { case 1: - return HORDE_FACTION; + return TEAM_HORDE; case 7: - return ALLIANCE_FACTION; + return TEAM_ALLIANCE; } - LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->BaseLanguage); + LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID); } else LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race)); - return ALLIANCE_FACTION; + return TEAM_ALLIANCE; } void Player::SetFactionForRace(uint8 race) @@ -5764,7 +5763,7 @@ void Player::SetFactionForRace(uint8 race) sScriptMgr->OnPlayerUpdateFaction(this); - if (GetTeamId() != GetTeamId()) + if (GetTeamId(true) != GetTeamId()) return; ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race); @@ -5882,7 +5881,7 @@ void Player::RewardReputation(Unit* victim, float rate) ChampioningFaction = GetChampioningFaction(); } - TeamId teamId = GetTeamId(); // Always check player original reputation when rewarding + TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE)) { @@ -6066,7 +6065,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, victim->getClass()); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, victim->getRace()); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, victim->getRace(true)); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, victim); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, victim); @@ -10271,7 +10270,7 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes // change but I couldn't find a suitable alternative. OK to use class because only DK // can use this taxi. - uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(), npc == nullptr || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT)); + uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT)); // in spell case allow 0 model if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0) @@ -10366,7 +10365,7 @@ void Player::ContinueTaxiFlight() LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString()); - uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(), true); + uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true); if (!mountDisplayId) return; @@ -10535,7 +10534,7 @@ void Player::InitDataForForm(bool reapplyMods) void Player::InitDisplayIds() { - PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass()); if (!info) { LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString()); @@ -10656,7 +10655,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin return false; } - if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId() == TEAM_ALLIANCE) || (pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId() == TEAM_HORDE))) + if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId(true) == TEAM_HORDE))) { return false; } @@ -11318,7 +11317,7 @@ void Player::ReportedAfkBy(Player* reporter) WorldLocation Player::GetStartPosition() const { - PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass()); uint32 mapId = info->mapId; if (getClass() == CLASS_DEATH_KNIGHT && HasSpell(50977)) return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f); @@ -14600,7 +14599,7 @@ void Player::_SaveCharacter(bool create, CharacterDatabaseTransaction trans) stmt->SetData(index++, GetGUID().GetCounter()); stmt->SetData(index++, GetSession()->GetAccountId()); stmt->SetData(index++, GetName()); - stmt->SetData(index++, getRace()); + stmt->SetData(index++, getRace(true)); stmt->SetData(index++, getClass()); stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt->SetData(index++, GetLevel()); @@ -14718,7 +14717,7 @@ void Player::_SaveCharacter(bool create, CharacterDatabaseTransaction trans) // Update query stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER); stmt->SetData(index++, GetName()); - stmt->SetData(index++, getRace()); + stmt->SetData(index++, getRace(true)); stmt->SetData(index++, getClass()); stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt->SetData(index++, GetLevel()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b756bd363..ead737bce 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2056,9 +2056,9 @@ public: void CheckAreaExploreAndOutdoor(); static TeamId TeamIdForRace(uint8 race); - [[nodiscard]] uint32 GetTeam() const { return m_team; } - [[nodiscard]] TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } + [[nodiscard]] TeamId GetTeamId(bool original = false) const { return original ? TeamIdForRace(getRace(true)) : m_team; }; void SetFactionForRace(uint8 race); + void setTeamId(TeamId teamid) { m_team = teamid; }; void InitDisplayIds(); @@ -2709,7 +2709,7 @@ public: void outDebugValues() const; ObjectGuid m_lootGuid; - uint32 m_team; + TeamId m_team; uint32 m_nextSave; // pussywizard uint16 m_additionalSaveTimer; // pussywizard uint8 m_additionalSaveMask; // pussywizard diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index eaf21b716..a943b590e 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -2310,12 +2310,12 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const return EQUIP_ERR_ITEM_NOT_FOUND; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId() != TEAM_HORDE) + if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId(true) != TEAM_HORDE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } - if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId() != TEAM_ALLIANCE) + if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId(true) != TEAM_ALLIANCE) { return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; } @@ -5076,7 +5076,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons //Need to call it to initialize m_team (m_team can be calculated from race) //Other way is to saves m_team into characters table. - SetFactionForRace(getRace()); + SetFactionForRace(getRace(true)); // pussywizard: create empty instance bind containers if necessary sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid); @@ -5249,7 +5249,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons else if (!taxi_nodes.empty()) { instanceId = 0; - if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId())) + if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true))) { // xinef: could no load valid data for taxi, relocate to homebind and clear m_taxi.ClearTaxiDestinations(); @@ -5311,7 +5311,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons map = sMapMgr->CreateMap(mapId, this); if (!map) { - PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass()); mapId = info->mapId; Relocate(info->positionX, info->positionY, info->positionZ, 0.0f); LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); @@ -6780,7 +6780,7 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map missingItems = &missingLeaderItems; } - if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId()) + if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true)) { if (!checkPlayer->HasItemCount(itemRequirement->id, 1)) { @@ -6802,7 +6802,7 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map missingAchievements = &missingLeaderAchievements; } - if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId()) + if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true)) { if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id)) { @@ -6824,7 +6824,7 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map missingQuests = &missingLeaderQuests; } - if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId()) + if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true)) { if (!checkPlayer->GetQuestRewardStatus(questRequirement->id)) { @@ -7005,7 +7005,7 @@ bool Player::CheckInstanceCount(uint32 instanceId) const bool Player::_LoadHomeBind(PreparedQueryResult result) { - PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass()); if (!info) { LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName()); diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 6fa6193dd..71b31db10 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1195,7 +1195,7 @@ void Player::UpdateArea(uint32 newArea) else RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY); - uint32 const areaRestFlag = (GetTeamId() == TEAM_ALLIANCE) + uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE) ? AREA_FLAG_REST_ZONE_ALLIANCE : AREA_FLAG_REST_ZONE_HORDE; if (area && area->flags & areaRestFlag) @@ -1255,12 +1255,12 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) { case AREATEAM_ALLY: pvpInfo.IsInHostileArea = - GetTeamId() != TEAM_ALLIANCE && + GetTeamId(true) != TEAM_ALLIANCE && (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL); break; case AREATEAM_HORDE: pvpInfo.IsInHostileArea = - GetTeamId() != TEAM_HORDE && + GetTeamId(true) != TEAM_HORDE && (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL); break; case AREATEAM_NONE: diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 19820d442..8370b0919 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9974,15 +9974,9 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, Au return true; } -void Unit::setPowerType(Powers new_powertype, bool sendUpdate/* = true*/) +void Unit::setPowerType(Powers new_powertype) { - if (getPowerType() == new_powertype) - return; - - SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_POWER_TYPE, new_powertype); - - if (!sendUpdate) - return; + SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype); if (GetTypeId() == TYPEID_PLAYER) { @@ -15185,10 +15179,7 @@ uint32 Unit::GetCreatureType() const if (ssEntry && ssEntry->creatureType > 0) return ssEntry->creatureType; else - { - ChrRacesEntry const* raceEntry = sChrRacesStore.AssertEntry(getRace()); - return raceEntry->CreatureType; - } + return CREATURE_TYPE_HUMANOID; } else return ToCreature()->GetCreatureTemplate()->type; @@ -21292,6 +21283,25 @@ void Unit::BuildCooldownPacket(WorldPacket& data, uint8 flags, PacketCooldowns c } } +uint8 Unit::getRace(bool original) const +{ + if (GetTypeId() == TYPEID_PLAYER) + { + if (original) + return m_realRace; + else + return m_race; + } + + return GetByteValue(UNIT_FIELD_BYTES_0, 0); +} + +void Unit::setRace(uint8 race) +{ + if (GetTypeId() == TYPEID_PLAYER) + m_race = race; +} + // Check if unit in combat with specific unit bool Unit::IsInCombatWith(Unit const* who) const { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 6a610a8e8..3213c01b9 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -39,14 +39,6 @@ #define BASE_MAXDAMAGE 2.0f #define BASE_ATTACK_TIME 2000 -enum UnitBytes0Offsets : uint8 -{ - UNIT_BYTES_0_OFFSET_RACE = 0, - UNIT_BYTES_0_OFFSET_CLASS = 1, - UNIT_BYTES_0_OFFSET_GENDER = 2, - UNIT_BYTES_0_OFFSET_POWER_TYPE = 3 -}; - enum UnitBytes1Offsets : uint8 { UNIT_BYTES_1_OFFSET_STAND_STATE = 0, @@ -1452,21 +1444,12 @@ public: [[nodiscard]] uint8 GetLevel() const { return getLevel(); } uint8 getLevelForTarget(WorldObject const* /*target*/) const override { return GetLevel(); } void SetLevel(uint8 lvl, bool showLevelChange = true); - [[nodiscard]] uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE); } - void setRace(uint8 race) { SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, race); } - [[nodiscard]] uint32 getRaceMask() const { return 1 << (getRace() - 1); } - [[nodiscard]] uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS); } - void setClass(uint8 classId) { SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, classId); } - [[nodiscard]] uint8 GetRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE); } - void SetRace(uint8 race) { SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, race); } - [[nodiscard]] uint32 GetRaceMask() const { return 1 << (getRace() - 1); } - [[nodiscard]] uint8 GetClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS); } - void SetClass(uint8 classId) { SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, classId); } + [[nodiscard]] uint8 getRace(bool original = false) const; + void setRace(uint8 race); + [[nodiscard]] uint32 getRaceMask() const { return 1 << (getRace(true) - 1); } + [[nodiscard]] uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); } [[nodiscard]] uint32 getClassMask() const { return 1 << (getClass() - 1); } - Gender getGender() const { return Gender(GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER)); } - void setGender(Gender gender) { SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, gender); } - virtual Gender GetNativeGender() const { return getGender(); } - virtual void SetNativeGender(Gender gender) { setGender(gender); } + [[nodiscard]] uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); } [[nodiscard]] float GetStat(Stats stat) const { return float(GetUInt32Value(static_cast(UNIT_FIELD_STAT0) + stat)); } void SetStat(Stats stat, int32 val) { SetStatInt32Value(static_cast(UNIT_FIELD_STAT0) + stat, val); } @@ -1497,8 +1480,8 @@ public: int32 ModifyHealth(int32 val); int32 GetHealthGain(int32 dVal); - [[nodiscard]] Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_POWER_TYPE)); } - void setPowerType(Powers power, bool sendUpdate = true); + [[nodiscard]] Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); } + void setPowerType(Powers power); [[nodiscard]] uint32 GetPower(Powers power) const { return GetUInt32Value(static_cast(UNIT_FIELD_POWER1) + power); } [[nodiscard]] uint32 GetMaxPower(Powers power) const { return GetUInt32Value(static_cast(UNIT_FIELD_MAXPOWER1) + power); } void SetPower(Powers power, uint32 val, bool withPowerUpdate = true, bool fromRegenerate = false); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 00103ba59..c40591cfd 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3744,8 +3744,8 @@ void ObjectMgr::LoadPlayerInfo() info->positionY = positionY; info->positionZ = positionZ; info->orientation = orientation; - info->displayId_m = rEntry->MaleDisplayID; - info->displayId_f = rEntry->FemaleDisplayID; + info->displayId_m = rEntry->model_m; + info->displayId_f = rEntry->model_f; _playerInfo[current_race][current_class] = info; ++count; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 7e687f92f..85344f670 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1441,7 +1441,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name) if (pInvitee->GetSocial()->HasIgnore(player->GetGUID())) return; - if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId() != player->GetTeamId()) + if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true)) { SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_NOT_ALLIED, name); return; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b0eaa3692..0e4a43a81 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -308,10 +308,10 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) } // prevent character creating Expansion race without Expansion account - if (raceEntry->RequiredExpansion > Expansion()) + if (raceEntry->expansion > Expansion()) { SendCharCreate(CHAR_CREATE_EXPANSION); - LOG_ERROR("network.opcode", "Expansion {} account:[{}] tried to Create character with expansion {} race ({})", Expansion(), GetAccountId(), raceEntry->RequiredExpansion, createInfo->Race); + LOG_ERROR("network.opcode", "Expansion {} account:[{}] tried to Create character with expansion {} race ({})", Expansion(), GetAccountId(), raceEntry->expansion, createInfo->Race); return; } @@ -325,13 +325,6 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) if (AccountMgr::IsPlayerAccount(GetSecurity())) { - if (raceEntry->Alliance == CHRRACES_ALLIANCE_TYPE_NOT_PLAYABLE || raceEntry->HasFlag(CHRRACES_FLAGS_NOT_PLAYABLE)) - { - LOG_ERROR("network", "Race ({}) was not playable but requested while creating new char for account (ID: {}): wrong DBC files or cheater?", createInfo->Race, GetAccountId()); - SendCharCreate(CHAR_CREATE_DISABLED); - return; - } - uint32 raceMaskDisabled = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK); if ((1 << (createInfo->Race - 1)) & raceMaskDisabled) { @@ -878,7 +871,7 @@ void WorldSession::HandlePlayerLoginFromDB(LoginQueryHolder const& holder) if (cEntry->CinematicSequence) pCurrChar->SendCinematicStart(cEntry->CinematicSequence); else if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace())) - pCurrChar->SendCinematicStart(rEntry->CinematicSequenceID); + pCurrChar->SendCinematicStart(rEntry->CinematicSequence); // send new char string if not empty if (!sWorld->GetNewCharString().empty()) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index cd93e5f9d..7146fea21 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -741,7 +741,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) return; } - uint32 teamFaction = player->GetTeamId() == TEAM_ALLIANCE ? FACTION_MASK_ALLIANCE : FACTION_MASK_HORDE; + uint32 teamFaction = player->GetTeamId(true) == TEAM_ALLIANCE ? FACTION_MASK_ALLIANCE : FACTION_MASK_HORDE; bool isTavernAreatrigger = sObjectMgr->IsTavernAreaTrigger(triggerId, teamFaction); if (!player->IsInAreaTriggerRadius(atEntry, isTavernAreatrigger ? 5.f : 0.f)) { diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 7af03c1b7..7d64fed6e 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -439,12 +439,12 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const } // not show loot for not own team - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId() != TEAM_HORDE) + if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId(true) != TEAM_HORDE) { return false; } - if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId() != TEAM_ALLIANCE) + if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId(true) != TEAM_ALLIANCE) { return false; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 7636d3ec2..b811441bf 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5104,13 +5104,17 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool target->PlayDistanceSound(11965); break; case 46354: // Blood Elf Illusion - // We change this to a if statement since workflow failed due to not having nuetral race as a part of the switch. if (caster) { - if (caster->getGender() == GENDER_FEMALE) - caster->CastSpell(target, 46356, true, nullptr, this); - else - caster->CastSpell(target, 46355, true, nullptr, this); + switch (caster->getGender()) + { + case GENDER_FEMALE: + caster->CastSpell(target, 46356, true, nullptr, this); + break; + case GENDER_MALE: + caster->CastSpell(target, 46355, true, nullptr, this); + break; + } } break; case 46361: // Reinforced Net diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 0b8a57d0a..4cf9e8bc1 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2206,7 +2206,7 @@ void World::DetectDBCLang() uint8 default_locale = TOTAL_LOCALES; for (uint8 i = default_locale - 1; i < TOTAL_LOCALES; --i) // -1 will be 255 due to uint8 { - if (race->Name[i][0] != '\0') // check by race names + if (race->name[i][0] != '\0') // check by race names { default_locale = i; _availableDbcLocaleMask |= (1 << i); diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp index 61050a4d3..6cc2876fd 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp @@ -134,11 +134,6 @@ void OutdoorPvPTF::ResetZoneToTeamControlled(TeamId team) m_HordeTowersControlled = 0; m_AllianceTowersControlled = 0; break; - case HORDE_FACTION: - case ALLIANCE_FACTION: - { - break; - } } for (auto& [guid, tower] : m_capturePoints) @@ -169,11 +164,6 @@ void OPvPCapturePointTF::ResetToTeamControlled(TeamId team) m_OldState = OBJECTIVESTATE_NEUTRAL; m_team = TEAM_NEUTRAL; break; - case HORDE_FACTION: - case ALLIANCE_FACTION: - { - break; - } } m_value = 0.0f; diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index f7a981ce3..34621293f 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -180,13 +180,13 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI { _state = ARGENT_PONY_STATE_ENCH; - aura = (player->GetTeamId() == TEAM_ALLIANCE ? SPELL_AURA_TIRED_S : SPELL_AURA_TIRED_G); + aura = (player->GetTeamId(true) == TEAM_ALLIANCE ? SPELL_AURA_TIRED_S : SPELL_AURA_TIRED_G); duration = player->GetSpellCooldownDelay(aura); me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_GOSSIP); for (uint8 i = 0; i < 3; ++i) { - if (player->GetTeamId() == TEAM_ALLIANCE) + if (player->GetTeamId(true) == TEAM_ALLIANCE) { if (uint32 cooldown = player->GetSpellCooldownDelay(SPELL_AURA_POSTMAN_S + i)) { @@ -211,7 +211,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI } // Generate Banners - uint32 mask = player->GetTeamId() ? RACEMASK_HORDE : RACEMASK_ALLIANCE; + uint32 mask = player->GetTeamId(true) ? RACEMASK_HORDE : RACEMASK_ALLIANCE; for (uint8 i = 1; i < MAX_RACES; ++i) if (mask & (1 << (i - 1)) && player->HasAchieved(argentBanners[i].achievement)) _banners[i] = true; @@ -268,7 +268,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI if (player->GetGUID() != creature->GetOwnerGUID()) return true; - if (!creature->HasAura(player->GetTeamId() ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S)) + if (!creature->HasAura(player->GetTeamId(true) ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S)) { uint8 _state = creature->AI()->GetData(0 /*GET_DATA_STATE*/); if (_state == ARGENT_PONY_STATE_ENCH || _state == ARGENT_PONY_STATE_VENDOR) @@ -296,20 +296,20 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI case GOSSIP_ACTION_TRADE: creature->ReplaceAllNpcFlags(UNIT_NPC_FLAG_VENDOR); player->GetSession()->SendListInventory(creature->GetGUID()); - spellId = player->GetTeamId() ? SPELL_AURA_SHOP_G : SPELL_AURA_SHOP_S; + spellId = player->GetTeamId(true) ? SPELL_AURA_SHOP_G : SPELL_AURA_SHOP_S; creature->AI()->DoAction(ARGENT_PONY_STATE_VENDOR); break; case GOSSIP_ACTION_BANK: creature->ReplaceAllNpcFlags(UNIT_NPC_FLAG_BANKER); player->GetSession()->SendShowBank(player->GetGUID()); - spellId = player->GetTeamId() ? SPELL_AURA_BANK_G : SPELL_AURA_BANK_S; + spellId = player->GetTeamId(true) ? SPELL_AURA_BANK_G : SPELL_AURA_BANK_S; creature->AI()->DoAction(ARGENT_PONY_STATE_BANK); break; case GOSSIP_ACTION_MAILBOX: { creature->ReplaceAllNpcFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_MAILBOX); player->GetSession()->SendShowMailBox(creature->GetGUID()); - spellId = player->GetTeamId() ? SPELL_AURA_POSTMAN_G : SPELL_AURA_POSTMAN_S; + spellId = player->GetTeamId(true) ? SPELL_AURA_POSTMAN_G : SPELL_AURA_POSTMAN_S; creature->AI()->DoAction(ARGENT_PONY_STATE_MAILBOX); break; } @@ -326,7 +326,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI { creature->CastSpell(creature, spellId, true); player->AddSpellCooldown(spellId, 0, 3 * MINUTE * IN_MILLISECONDS); - player->AddSpellCooldown(player->GetTeamId() ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S, 0, 3 * MINUTE * IN_MILLISECONDS + 4 * HOUR * IN_MILLISECONDS); + player->AddSpellCooldown(player->GetTeamId(true) ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S, 0, 3 * MINUTE * IN_MILLISECONDS + 4 * HOUR * IN_MILLISECONDS); creature->DespawnOrUnsummon(3 * MINUTE * IN_MILLISECONDS); } return true; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 2fb1e4a41..0acf396ff 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1968,7 +1968,7 @@ class spell_pvp_trinket_wotf_shared_cd : public SpellScript // Spell::SendSpellCooldown() skips all spells with TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD player->AddSpellAndCategoryCooldowns(GetSpellInfo(), GetCastItem() ? GetCastItem()->GetEntry() : 0, GetSpell()); - if (player->GetTeamId() == TEAM_HORDE) + if (player->GetTeamId(true) == TEAM_HORDE) { if (GetSpellInfo()->Id == SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) { diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 624f81da5..8a5393942 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -3643,7 +3643,7 @@ class spell_item_recall : public SpellScript } TeamId bgTeam = player->GetBgTeamId(); - if (player->GetTeamId() != bgTeam) + if (player->GetTeamId(true) != bgTeam) { if (SpellTargetPosition const* recallSpellTarget = sSpellMgr->GetSpellTargetPosition(bgTeam == TEAM_HORDE ? SPELL_RECALL_HORDE : SPELL_RECALL_ALLIANCE, EFFECT_0)) { diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index 27070cda3..43ff3e7ff 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -668,13 +668,6 @@ struct ChrClassesEntry uint32 expansion; // 59 (0 - original race, 1 - tbc addon, ...) }; -enum ChrRacesAllianceType -{ - CHRRACES_ALLIANCE_TYPE_ALLIANCE = 0, - CHRRACES_ALLIANCE_TYPE_HORDE = 1, - CHRRACES_ALLIANCE_TYPE_NOT_PLAYABLE = 2, -}; - enum ChrRacesFlags { CHRRACES_FLAGS_NOT_PLAYABLE = 0x01, @@ -684,29 +677,25 @@ enum ChrRacesFlags struct ChrRacesEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 FactionID; // 2 - //uint32 ExplorationSoundID; // 3 - uint32 MaleDisplayID; // 4 - uint32 FemaleDisplayID; // 5 - //char const* ClientPrefix; // 6 - uint32 BaseLanguage; // 7 (7-Alliance 1-Horde) - uint32 CreatureType; // 8 - uint32 ResSicknessSpellID; // 9 - //uint32 SplashSoundID; // 10 - //char const* ClientFileString; // 11 - uint32 CinematicSequenceID; // 12 ID from CinematicSequences.dbc - uint32 Alliance; // 13 - char const* Name[16]; // 14-29 - //uint32 Name_lang_mask; // 30 - //char const* NameFemale[16]; // 31-46 - //uint32 NameFemale_lang_mask; // 47 - //char const* NameMale[16]; // 48-63 - //uint32 NameMale_lang_mask; // 64 - //char const* FacialHairCustomization[2]; // 65-66 - //char const* HairCustomization; // 67 - uint32 RequiredExpansion; // 68 + uint32 RaceID; // 0 + uint32 Flags; // 1 + uint32 FactionID; // 2 facton template id + // 3 unused + uint32 model_m; // 4 + uint32 model_f; // 5 + // 6 unused + uint32 TeamID; // 7 (7-Alliance 1-Horde) + // 8-11 unused + uint32 CinematicSequence; // 12 id from CinematicSequences.dbc + //uint32 unk_322; // 13 faction (0 alliance, 1 horde, 2 not available?) + char const* name[16]; // 14-29 used for DBC language detection/selection + // 30 string flags, unused + //char const* nameFemale[16]; // 31-46, if different from base (male) case + // 47 string flags, unused + //char const* nameNeutralGender[16]; // 48-63, if different from base (male) case + // 64 string flags, unused + // 65-67 unused + uint32 expansion; // 68 (0 - original race, 1 - tbc addon, ...) inline bool HasFlag(ChrRacesFlags flag) const { return (Flags & flag) != 0; } }; diff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h index eb302519f..c672332be 100644 --- a/src/server/shared/DataStores/DBCfmt.h +++ b/src/server/shared/DataStores/DBCfmt.h @@ -32,7 +32,7 @@ char constexpr CharStartOutfitEntryfmt[] = "dbbbXiiiiiiiiiiiiiiiiiiiiiiiixxxxxxx char constexpr CharTitlesEntryfmt[] = "nxssssssssssssssssxssssssssssssssssxi"; char constexpr ChatChannelsEntryfmt[] = "nixssssssssssssssssxxxxxxxxxxxxxxxxxx"; // ChatChannelsEntryfmt, index not used (more compact store) char constexpr ChrClassesEntryfmt[] = "nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii"; -char constexpr ChrRacesEntryfmt[] = "niixiixiiixxiissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; +char constexpr ChrRacesEntryfmt[] = "niixiixixxxxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; char constexpr CinematicCameraEntryfmt[] = "nsiffff"; char constexpr CinematicSequencesEntryfmt[] = "nxixxxxxxx"; char constexpr CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxx"; diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index a01879c50..3a5623d8a 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -730,10 +730,8 @@ enum Language enum TeamId { TEAM_ALLIANCE = 0, - TEAM_HORDE = 1, - TEAM_NEUTRAL = 2, - HORDE_FACTION = 67, - ALLIANCE_FACTION = 469 + TEAM_HORDE, + TEAM_NEUTRAL, }; enum Team