mirror of
https://github.com/ZhengPeiRu21/mod-individual-progression
synced 2025-11-29 23:44:51 +08:00
318 lines
14 KiB
C++
318 lines
14 KiB
C++
|
|
#include "Player.h"
|
|
#include "ScriptMgr.h"
|
|
#include "ScriptedCreature.h"
|
|
#include "ScriptedGossip.h"
|
|
|
|
enum CraftsSpellIds : uint32
|
|
{
|
|
// Tailoring
|
|
LEARN_GLACIAL_GLOVES = 28261,
|
|
HAS_GLACIAL_GLOVES = 28205,
|
|
LEARN_GLACIAL_WRISTS = 28262,
|
|
HAS_GLACIAL_WRISTS = 28209,
|
|
LEARN_GLACIAL_VEST = 28260,
|
|
HAS_GLACIAL_VEST = 28207,
|
|
LEARN_GLACIAL_CLOAK = 28263,
|
|
HAS_GLACIAL_CLOAK = 28208,
|
|
|
|
// Leatherworking
|
|
LEARN_POLAR_GLOVES = 28255,
|
|
HAS_POLAR_GLOVES = 28220,
|
|
LEARN_POLAR_BRACERS = 28256,
|
|
HAS_POLAR_BRACERS = 28221,
|
|
LEARN_POLAR_TUNIC = 28254,
|
|
HAS_POLAR_TUNIC = 28219,
|
|
LEARN_ICY_SCALE_GAUNTLETS = 28258,
|
|
HAS_ICY_SCALE_GAUNTLETS = 28223,
|
|
LEARN_ICY_SCALE_BRACERS = 28259,
|
|
HAS_ICY_SCALE_BRACERS = 28224,
|
|
LEARN_ICY_SCALE_BREASTPLATE = 28257,
|
|
HAS_ICY_SCALE_BREASTPLATE = 28222,
|
|
|
|
// Blacksmithing
|
|
LEARN_ICEBANE_GAUNTLETS = 28253,
|
|
HAS_ICEBANE_GAUNTLETS = 28243,
|
|
LEARN_ICEBANE_BRACERS = 28252,
|
|
HAS_ICEBANE_BRACERS = 28244,
|
|
LEARN_ICEBANE_BREASTPLATE = 28251,
|
|
HAS_ICEBANE_BREASTPLATE = 28242
|
|
};
|
|
|
|
enum Say
|
|
{
|
|
BROADCAST_TEXT_SPIT_TARGET = 31673
|
|
};
|
|
|
|
enum Requirements
|
|
{
|
|
FACTION_ARGENT_DAWN = 529,
|
|
BOOK_REQ_RANK = REP_REVERED,
|
|
CRAFT1_REQ_RANK = REP_REVERED,
|
|
CRAFT2_REQ_RANK = REP_EXALTED,
|
|
MASTER_REQ_SKILL = 225,
|
|
LEARN_REQ_SKILL = 300
|
|
};
|
|
|
|
enum Quests
|
|
{
|
|
QUEST_OMARIONS_HANDBOOK = 9233,
|
|
OMARIONS_HANDBOOK = 22719
|
|
};
|
|
|
|
enum Gossips
|
|
{
|
|
// NPC Text IDs
|
|
NPC_TEXT_INTRO = 8507,
|
|
NPC_TEXT_NO_CRAFTER = 8516,
|
|
NPC_TEXT_NEW_ENTRY = 24400,
|
|
NPC_TEXT_TAILORING = NPC_TEXT_NEW_ENTRY + 1,
|
|
NPC_TEXT_BLACKSMITHING = NPC_TEXT_NEW_ENTRY + 2,
|
|
NPC_TEXT_LEATHERWORKING = NPC_TEXT_NEW_ENTRY + 3,
|
|
|
|
// Menu IDs
|
|
MENU_ID_ENTRY = 24400,
|
|
MENU_ID_NO_CRAFTER = MENU_ID_ENTRY,
|
|
MENU_ID_TAILORING = MENU_ID_ENTRY + 1,
|
|
MENU_ID_BLACKSMITHING = MENU_ID_ENTRY + 2,
|
|
MENU_ID_LEATHERWORKING = MENU_ID_ENTRY + 3,
|
|
MENU_ID_INTRO = MENU_ID_ENTRY + 4,
|
|
|
|
// Intro
|
|
ITEM_ID_LEATHERWORKING = 1,
|
|
ITEM_ID_BLACKSMITHING = 2,
|
|
ITEM_ID_TAILORING = 3,
|
|
ITEM_ID_NO_CRAFTER = 4,
|
|
|
|
// Tailoring
|
|
ITEM_ID_GLACIAL_CLOAK = 1,
|
|
ITEM_ID_GLACIAL_GLOVES = 2,
|
|
ITEM_ID_GLACIAL_WRISTS = 3,
|
|
ITEM_ID_GLACIAL_VEST = 4,
|
|
ITEM_ID_GOODBYE_TAILORING = 5,
|
|
|
|
// Blacksmithing
|
|
ITEM_ID_ICEBANE_BRACERS = 1,
|
|
ITEM_ID_ICEBANE_GAUNTLETS = 2,
|
|
ITEM_ID_ICEBANE_BREASTPLATE = 3,
|
|
ITEM_ID_GOODBYE_BLACKSMITHING = 4,
|
|
|
|
// Leatherworking
|
|
ITEM_ID_POLAR_BRACERS = 1,
|
|
ITEM_ID_POLAR_GLOVES = 2,
|
|
ITEM_ID_POLAR_TUNIC = 3,
|
|
ITEM_ID_ICY_SCALE_BRACERS = 4,
|
|
ITEM_ID_ICY_SCALE_GAUNTLETS = 5,
|
|
ITEM_ID_ICY_SCALE_BREASTPLATE = 6,
|
|
ITEM_ID_GOODBYE_LEATHERWORKING = 7,
|
|
|
|
// No crafter, book
|
|
ITEM_ID_GOODBYE_NO_CRAFTER = 1,
|
|
|
|
GOSSIP_CLOSE = 100
|
|
};
|
|
|
|
class npc_omarion : public CreatureScript
|
|
{
|
|
public:
|
|
npc_omarion() : CreatureScript("npc_omarion_gossip") { }
|
|
|
|
|
|
bool OnGossipHello(Player* player, Creature* creature) override
|
|
{
|
|
ClearGossipMenuFor(player);
|
|
uint32 tailorSkill = player->GetSkillValue(SKILL_TAILORING);
|
|
uint32 blacksmithSkill = player->GetSkillValue(SKILL_BLACKSMITHING);
|
|
uint32 leatherworkSkill = player->GetSkillValue(SKILL_LEATHERWORKING);
|
|
if (tailorSkill >= MASTER_REQ_SKILL)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_TAILORING, GOSSIP_SENDER_MAIN, MENU_ID_TAILORING);
|
|
}
|
|
|
|
if(blacksmithSkill >= MASTER_REQ_SKILL)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_BLACKSMITHING, GOSSIP_SENDER_MAIN, MENU_ID_BLACKSMITHING);
|
|
}
|
|
|
|
if(leatherworkSkill >= MASTER_REQ_SKILL)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_LEATHERWORKING, GOSSIP_SENDER_MAIN, MENU_ID_LEATHERWORKING);
|
|
}
|
|
|
|
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_NO_CRAFTER, GOSSIP_SENDER_MAIN, MENU_ID_NO_CRAFTER);
|
|
SendGossipMenuFor(player, NPC_TEXT_INTRO, creature->GetGUID());
|
|
return true;
|
|
}
|
|
|
|
void LearnCraftIfNotAlreadyKnown(uint32 learnId, uint32 knowId, Player *player)
|
|
{
|
|
if (!player->HasSpell(knowId))
|
|
{
|
|
player->CastSpell(player, learnId, false);
|
|
}
|
|
}
|
|
|
|
void CloseGossipEmoteAndSpitOnPlayer(Player* player, Creature* creature)
|
|
{
|
|
CloseGossipMenuFor(player);
|
|
creature->TextEmote(BROADCAST_TEXT_SPIT_TARGET, player);
|
|
creature->HandleEmoteCommand(EMOTE_ONESHOT_NONE); // skip animation
|
|
creature->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);
|
|
}
|
|
|
|
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
|
{
|
|
uint32 argentDawnRep = player->GetReputationRank(FACTION_ARGENT_DAWN);
|
|
uint32 tailorSkill = player->GetSkillValue(SKILL_TAILORING);
|
|
uint32 blacksmithSkill = player->GetSkillValue(SKILL_BLACKSMITHING);
|
|
uint32 leatherworkSkill = player->GetSkillValue(SKILL_LEATHERWORKING);
|
|
|
|
switch(action)
|
|
{
|
|
case GOSSIP_CLOSE:
|
|
CloseGossipMenuFor(player);
|
|
break;
|
|
case MENU_ID_TAILORING:
|
|
ClearGossipMenuFor(player);
|
|
if (argentDawnRep < CRAFT1_REQ_RANK || tailorSkill < LEARN_REQ_SKILL)
|
|
{
|
|
CloseGossipEmoteAndSpitOnPlayer(player, creature);
|
|
break;
|
|
}
|
|
if (argentDawnRep >= CRAFT1_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_TAILORING, ITEM_ID_GLACIAL_WRISTS, GOSSIP_SENDER_MAIN, LEARN_GLACIAL_WRISTS);
|
|
AddGossipItemFor(player, MENU_ID_TAILORING, ITEM_ID_GLACIAL_GLOVES, GOSSIP_SENDER_MAIN, LEARN_GLACIAL_GLOVES);
|
|
}
|
|
if (argentDawnRep >= CRAFT2_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_TAILORING, ITEM_ID_GLACIAL_VEST, GOSSIP_SENDER_MAIN, LEARN_GLACIAL_VEST);
|
|
AddGossipItemFor(player, MENU_ID_TAILORING, ITEM_ID_GLACIAL_CLOAK, GOSSIP_SENDER_MAIN, LEARN_GLACIAL_CLOAK);
|
|
}
|
|
AddGossipItemFor(player, MENU_ID_TAILORING, ITEM_ID_GOODBYE_TAILORING, GOSSIP_SENDER_MAIN, GOSSIP_CLOSE);
|
|
SendGossipMenuFor(player, NPC_TEXT_TAILORING, creature->GetGUID());
|
|
break;
|
|
case MENU_ID_BLACKSMITHING:
|
|
ClearGossipMenuFor(player);
|
|
if (argentDawnRep < CRAFT1_REQ_RANK || blacksmithSkill < LEARN_REQ_SKILL)
|
|
{
|
|
CloseGossipEmoteAndSpitOnPlayer(player, creature);
|
|
break;
|
|
}
|
|
if (argentDawnRep >= CRAFT1_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_BLACKSMITHING, ITEM_ID_ICEBANE_BRACERS, GOSSIP_SENDER_MAIN, LEARN_ICEBANE_BRACERS);
|
|
AddGossipItemFor(player, MENU_ID_BLACKSMITHING, ITEM_ID_ICEBANE_GAUNTLETS, GOSSIP_SENDER_MAIN, LEARN_ICEBANE_GAUNTLETS);
|
|
}
|
|
if (argentDawnRep >= CRAFT2_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_BLACKSMITHING, ITEM_ID_ICEBANE_BREASTPLATE, GOSSIP_SENDER_MAIN, LEARN_ICEBANE_BREASTPLATE);
|
|
}
|
|
AddGossipItemFor(player, MENU_ID_BLACKSMITHING, ITEM_ID_GOODBYE_BLACKSMITHING, GOSSIP_SENDER_MAIN, GOSSIP_CLOSE);
|
|
SendGossipMenuFor(player, NPC_TEXT_BLACKSMITHING, creature->GetGUID());
|
|
break;
|
|
case MENU_ID_LEATHERWORKING:
|
|
ClearGossipMenuFor(player);
|
|
if (argentDawnRep < CRAFT1_REQ_RANK || leatherworkSkill < LEARN_REQ_SKILL)
|
|
{
|
|
CloseGossipEmoteAndSpitOnPlayer(player, creature);
|
|
break;
|
|
}
|
|
if (argentDawnRep >= CRAFT1_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_POLAR_BRACERS, GOSSIP_SENDER_MAIN, LEARN_POLAR_BRACERS);
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_POLAR_GLOVES, GOSSIP_SENDER_MAIN, LEARN_POLAR_GLOVES);
|
|
}
|
|
if (argentDawnRep >= CRAFT2_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_POLAR_TUNIC, GOSSIP_SENDER_MAIN, LEARN_POLAR_TUNIC);
|
|
}
|
|
if (argentDawnRep >= CRAFT1_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_ICY_SCALE_BRACERS, GOSSIP_SENDER_MAIN, LEARN_ICY_SCALE_BRACERS);
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_ICY_SCALE_GAUNTLETS, GOSSIP_SENDER_MAIN, LEARN_ICY_SCALE_GAUNTLETS);
|
|
}
|
|
if (argentDawnRep >= CRAFT2_REQ_RANK)
|
|
{
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_ICY_SCALE_BREASTPLATE, GOSSIP_SENDER_MAIN, LEARN_ICY_SCALE_BREASTPLATE);
|
|
}
|
|
AddGossipItemFor(player, MENU_ID_LEATHERWORKING, ITEM_ID_GOODBYE_LEATHERWORKING, GOSSIP_SENDER_MAIN, GOSSIP_CLOSE);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case MENU_ID_NO_CRAFTER:
|
|
ClearGossipMenuFor(player);
|
|
if (argentDawnRep < BOOK_REQ_RANK)
|
|
{
|
|
CloseGossipEmoteAndSpitOnPlayer(player, creature);
|
|
break;
|
|
}
|
|
if (player->GetQuestStatus(QUEST_OMARIONS_HANDBOOK) == QUEST_STATUS_NONE && !player->HasItemCount(OMARIONS_HANDBOOK, 1, true))
|
|
{
|
|
player->AddItem(OMARIONS_HANDBOOK, 1);
|
|
}
|
|
AddGossipItemFor(player, MENU_ID_NO_CRAFTER, ITEM_ID_GOODBYE_NO_CRAFTER, GOSSIP_SENDER_MAIN, GOSSIP_CLOSE);
|
|
SendGossipMenuFor(player, NPC_TEXT_NO_CRAFTER, creature->GetGUID());
|
|
break;
|
|
case LEARN_GLACIAL_CLOAK:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_GLACIAL_CLOAK, HAS_GLACIAL_CLOAK, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_TAILORING, creature->GetGUID());
|
|
break;
|
|
case LEARN_GLACIAL_GLOVES:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_GLACIAL_GLOVES, HAS_GLACIAL_GLOVES, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_TAILORING, creature->GetGUID());
|
|
break;
|
|
case LEARN_GLACIAL_WRISTS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_GLACIAL_WRISTS, HAS_GLACIAL_WRISTS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_TAILORING, creature->GetGUID());
|
|
break;
|
|
case LEARN_GLACIAL_VEST:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_GLACIAL_VEST, HAS_GLACIAL_VEST, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_TAILORING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICEBANE_BRACERS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICEBANE_BRACERS, HAS_ICEBANE_BRACERS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_BLACKSMITHING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICEBANE_GAUNTLETS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICEBANE_GAUNTLETS, HAS_ICEBANE_GAUNTLETS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_BLACKSMITHING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICEBANE_BREASTPLATE:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICEBANE_BREASTPLATE, HAS_ICEBANE_BREASTPLATE, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_BLACKSMITHING, creature->GetGUID());
|
|
break;
|
|
case LEARN_POLAR_BRACERS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_POLAR_BRACERS, HAS_POLAR_BRACERS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case LEARN_POLAR_GLOVES:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_POLAR_GLOVES, HAS_POLAR_GLOVES, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case LEARN_POLAR_TUNIC:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_POLAR_TUNIC, HAS_POLAR_TUNIC, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICY_SCALE_BRACERS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICY_SCALE_BRACERS, HAS_ICY_SCALE_BRACERS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICY_SCALE_GAUNTLETS:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICY_SCALE_GAUNTLETS, HAS_ICY_SCALE_GAUNTLETS, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
case LEARN_ICY_SCALE_BREASTPLATE:
|
|
LearnCraftIfNotAlreadyKnown(LEARN_ICY_SCALE_BREASTPLATE, HAS_ICY_SCALE_BREASTPLATE, player);
|
|
SendGossipMenuFor(player, NPC_TEXT_LEATHERWORKING, creature->GetGUID());
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
void AddSC_npc_omarion()
|
|
{
|
|
new npc_omarion();
|
|
}
|