aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-10-29 18:53:16 +0100
committerShauren <shauren.trinity@gmail.com>2017-10-29 18:53:16 +0100
commit99f5d0614964041686083d497e7b8ccd572536b6 (patch)
tree953c9d891b9dc5a0671ca829a09fc05816c03c0b
parent2db1bf000a1ca0c91351f991f5d6c987d8955952 (diff)
Core/Taxi: Apply reputation discount to all points in multi-segment paths
-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.h10
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp3
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h2
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