diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-10-29 18:53:16 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-10-29 18:53:16 +0100 |
commit | 99f5d0614964041686083d497e7b8ccd572536b6 (patch) | |
tree | 953c9d891b9dc5a0671ca829a09fc05816c03c0b | |
parent | 2db1bf000a1ca0c91351f991f5d6c987d8955952 (diff) |
Core/Taxi: Apply reputation discount to all points in multi-segment paths
7 files changed, 35 insertions, 11 deletions
diff --git a/sql/updates/characters/master/2017_10_29_00_characters.sql b/sql/updates/characters/master/2017_10_29_00_characters.sql new file mode 100644 index 00000000000..1c991f135de --- /dev/null +++ b/sql/updates/characters/master/2017_10_29_00_characters.sql @@ -0,0 +1 @@ +UPDATE `characters` SET `taxi_path`=CONCAT('0 ', `taxi_path`) WHERE LENGTH(`taxi_path`) > 0; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1e3cc75ba8f..453b73c3071 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22052,8 +22052,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) { @@ -24297,11 +24300,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 0d62ea2e6a3..50381ae0146 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1290,6 +1290,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int64 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 816920049e3..1b6accbc88a 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -120,8 +120,12 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint3 ClearTaxiDestinations(); Tokenizer tokens(values, ' '); + auto iter = tokens.begin(); + if (iter != tokens.end()) + m_flightMasterFactionId = atoul(*iter); - for (Tokenizer::const_iterator iter = tokens.begin(); iter != tokens.end(); ++iter) + ++iter; + for (; iter != tokens.end(); ++iter) { uint32 node = atoul(*iter); AddTaxiDestination(node); @@ -156,6 +160,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] << ' '; @@ -176,7 +181,7 @@ uint32 PlayerTaxi::GetCurrentTaxiPath() const return path; } -std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi) +std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi) { for (uint8 i = 0; i < TaxiMaskSize; ++i) ss << uint32(taxi.m_taximask[i]) << ' '; @@ -203,3 +208,8 @@ bool PlayerTaxi::RequestEarlyLanding() return false; } + +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 82abf771bf8..d0bd0dc2311 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.h +++ b/src/server/game/Entities/Player/PlayerTaxi.h @@ -7,6 +7,7 @@ #include <iosfwd> #include <vector> +struct FactionTemplateEntry; namespace WorldPackets { namespace Taxi @@ -18,7 +19,7 @@ namespace WorldPackets 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); @@ -63,13 +64,16 @@ class TC_GAME_API PlayerTaxi bool RequestEarlyLanding(); 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); + 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); +std::ostringstream& operator <<(std::ostringstream& ss, PlayerTaxi const& taxi); #endif diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index d1393ed1611..733721945ea 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -265,6 +265,7 @@ void FlightPathMovementGenerator::LoadPath(Player* player, uint32 startNode /*= i_currentNode = startNode; _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; @@ -297,7 +298,7 @@ void FlightPathMovementGenerator::LoadPath(Player* player, uint32 startNode /*= } } - _pointsForPathSwitch.push_back({ uint32(i_path.size() - 1), int32(cost) }); + _pointsForPathSwitch.push_back({ uint32(i_path.size() - 1), int64(ceil(cost * discount)) }); } } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index d7610810d38..9fdcd4ec275 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -145,7 +145,7 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium< Player, Flig struct TaxiNodeChangeInfo { uint32 PathIndex; - int32 Cost; + int64 Cost; }; std::deque<TaxiNodeChangeInfo> _pointsForPathSwitch; //! node indexes and costs where TaxiPath changes |