From 23bfb33b3050f6fcc520864ad1a03ad013a087ef Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Wed, 17 Jun 2026 09:02:33 +0000 Subject: [PATCH] feat(custom): Klauss - PNJ taux XP perso, gossip FR, cap x7 (entry 1000000) --- src/server/scripts/Custom/custom_npcs.cpp | 32 ++++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/server/scripts/Custom/custom_npcs.cpp b/src/server/scripts/Custom/custom_npcs.cpp index ee04e50..d5fe8fb 100644 --- a/src/server/scripts/Custom/custom_npcs.cpp +++ b/src/server/scripts/Custom/custom_npcs.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#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; } };