feat(custom): Klauss - PNJ taux XP perso, gossip FR, cap x7 (entry 1000000)

This commit is contained in:
SylvaniaCore deploy
2026-06-17 09:02:33 +00:00
parent 18f0889847
commit 23bfb33b30
+22 -10
View File
@@ -15,6 +15,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Chat.h"
#include "Creature.h"
#include "Player.h"
#include "ScriptedGossip.h"
@@ -26,29 +27,32 @@ class npc_rate_xp_modifier : public CreatureScript
public:
npc_rate_xp_modifier() : CreatureScript("npc_rate_xp_modifier") { }
#define MAX_RATE uint32(10)
// Taux d'expérience personnel maximum sélectionnable (bride serveur)
#define MAX_RATE uint32(7)
bool OnGossipHello(Player* player, Creature* creature) override
{
// Sans taux personnel, le core applique RATE_XP_QUEST aux kills
// comme aux quêtes (Formulas.h / Player.cpp) : c'est LE taux par défaut.
float defaultRate = sWorld->getRate(RATE_XP_QUEST);
for (uint32 i = 1; i <= MAX_RATE; ++i)
{
if (i == player->GetPersonnalXpRate())
continue;
if (i == sWorld->getRate(RATE_XP_KILL))
if (float(i) == defaultRate)
continue;
std::ostringstream gossipText;
gossipText << "Rate x" << i;
gossipText << "Taux d'expérience x" << i;
AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipText.str(), GOSSIP_SENDER_MAIN, i);
}
if (player->GetPersonnalXpRate())
{
std::ostringstream gossipText;
gossipText << "Default Rate - x" << sWorld->getRate(RATE_XP_KILL);
AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipText.str(), GOSSIP_SENDER_MAIN, 0);
}
// Toujours proposer le retour au taux par défaut du royaume (x1, Blizzlike)
std::ostringstream defaultText;
defaultText << "Revenir au taux par défaut (x" << defaultRate << ")";
AddGossipItemFor(player, GOSSIP_ICON_CHAT, defaultText.str(), GOSSIP_SENDER_MAIN, 0);
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
return true;
@@ -57,7 +61,15 @@ class npc_rate_xp_modifier : public CreatureScript
bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*uiSender*/, uint32 uiAction) override
{
CloseGossipMenuFor(player);
player->SetPersonnalXpRate(float(std::min(MAX_RATE, uiAction)));
uint32 newRate = std::min(MAX_RATE, uiAction);
player->SetPersonnalXpRate(float(newRate));
if (newRate)
ChatHandler(player->GetSession()).PSendSysMessage("Votre taux d'expérience personnel est désormais x%u.", newRate);
else
ChatHandler(player->GetSession()).PSendSysMessage("Votre taux d'expérience est revenu à la valeur par défaut du royaume (x%g).", sWorld->getRate(RATE_XP_QUEST));
return true;
}
};