aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-10-29 19:10:12 +0100
committerShauren <shauren.trinity@gmail.com>2017-10-29 19:13:32 +0100
commite947fcedee5fcf3983cd4a745eebcb0e05f9d771 (patch)
tree8050690622366d1305d215bbc5835804a9aa6688
parent492b6affb0bc07c595e5a315f70ad51661815c99 (diff)
Core/Taxi: Apply reputation discount to all points in multi-segment paths
(cherry picked from commit 99f5d0614964041686083d497e7b8ccd572536b6)
-rw-r--r--sql/updates/characters/master/2017_10_29_00_characters.sql1
-rw-r--r--src/server/game/Entities/Player/Player.cpp15
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.cpp14
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.h6
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp3
6 files changed, 32 insertions, 8 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 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)) });
}
}