diff options
Diffstat (limited to 'src')
5 files changed, 31 insertions, 8 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 96e3cad3d7c..d5e06900761 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21238,8 +21238,11 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc { float discount = GetReputationPriceDiscount(npc); totalcost = uint32(ceil(totalcost * discount)); - firstcost = uint32(round(firstcost * discount)); + firstcost = uint32(ceil(firstcost * discount)); + m_taxi.SetFlightMasterFactionTemplateId(npc->GetFaction()); } + else + m_taxi.SetFlightMasterFactionTemplateId(0); if (money < totalcost) { @@ -23213,11 +23216,15 @@ bool Player::GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const float Player::GetReputationPriceDiscount(Creature const* creature) const { - FactionTemplateEntry const* vendor_faction = creature->GetFactionTemplateEntry(); - if (!vendor_faction || !vendor_faction->faction) + return GetReputationPriceDiscount(creature->GetFactionTemplateEntry()); +} + +float Player::GetReputationPriceDiscount(FactionTemplateEntry const* factionTemplate) const +{ + if (!factionTemplate || !factionTemplate->faction) return 1.0f; - ReputationRank rank = GetReputationRank(vendor_faction->faction); + ReputationRank rank = GetReputationRank(factionTemplate->faction); if (rank <= REP_NEUTRAL) return 1.0f; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 55db381ada9..bc72066307f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1126,6 +1126,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore); float GetReputationPriceDiscount(Creature const* creature) const; + float GetReputationPriceDiscount(FactionTemplateEntry const* factionTemplate) const; Player* GetTrader() const; TradeData* GetTradeData() const { return m_trade; } diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp index 9a53838e4a9..74a11230d4e 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -91,9 +91,13 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint3 { ClearTaxiDestinations(); - Tokenizer Tokenizer(values, ' '); + Tokenizer tokens(values, ' '); + auto iter = tokens.begin(); + if (iter != tokens.end()) + m_flightMasterFactionId = atoul(*iter); - for (Tokenizer::const_iterator iter = Tokenizer.begin(); iter != Tokenizer.end(); ++iter) + ++iter; + for (; iter != tokens.end(); ++iter) { uint32 node = atoul(*iter); AddTaxiDestination(node); @@ -128,6 +132,7 @@ std::string PlayerTaxi::SaveTaxiDestinationsToString() return ""; std::ostringstream ss; + ss << m_flightMasterFactionId << ' '; for (size_t i = 0; i < m_TaxiDestinations.size(); ++i) ss << m_TaxiDestinations[i] << ' '; @@ -154,3 +159,8 @@ std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi) ss << taxi.m_taximask[i] << ' '; return ss; } + +FactionTemplateEntry const* PlayerTaxi::GetFlightMasterFactionTemplate() const +{ + return sFactionTemplateStore.LookupEntry(m_flightMasterFactionId); +} diff --git a/src/server/game/Entities/Player/PlayerTaxi.h b/src/server/game/Entities/Player/PlayerTaxi.h index ae5052b3e7a..a4791c0ff4e 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.h +++ b/src/server/game/Entities/Player/PlayerTaxi.h @@ -24,11 +24,12 @@ #include <iosfwd> class ByteBuffer; +struct FactionTemplateEntry; class TC_GAME_API PlayerTaxi { public: - PlayerTaxi() { m_taximask.fill(0); } + PlayerTaxi() : m_flightMasterFactionId(0) { m_taximask.fill(0); } ~PlayerTaxi() { } // Nodes void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level); @@ -71,11 +72,14 @@ class TC_GAME_API PlayerTaxi std::deque<uint32> const& GetPath() const { return m_TaxiDestinations; } bool empty() const { return m_TaxiDestinations.empty(); } + FactionTemplateEntry const* GetFlightMasterFactionTemplate() const; + void SetFlightMasterFactionTemplateId(uint32 factionTemplateId) { m_flightMasterFactionId = factionTemplateId; } friend std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi); private: TaxiMask m_taximask; std::deque<uint32> m_TaxiDestinations; + uint32 m_flightMasterFactionId; }; std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi); diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index cf50e273975..c772cc055a6 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -348,6 +348,7 @@ void FlightPathMovementGenerator::LoadPath(Player* player) { _pointsForPathSwitch.clear(); std::deque<uint32> const& taxi = player->m_taxi.GetPath(); + float discount = player->GetReputationPriceDiscount(player->m_taxi.GetFlightMasterFactionTemplate()); for (uint32 src = 0, dst = 1; dst < taxi.size(); src = dst++) { uint32 path, cost; @@ -380,7 +381,7 @@ void FlightPathMovementGenerator::LoadPath(Player* player) } } - _pointsForPathSwitch.push_back({ uint32(_path.size() - 1), int32(cost) }); + _pointsForPathSwitch.push_back({ uint32(_path.size() - 1), int32(ceil(cost * discount)) }); } } |
