Many credits to Legend at ascentemu for the buff NPC which this script was based off of.
I have taken Legend's buff NPC and Turned it into a portable item.
Here is the source code:
Code:
#include "StdAfx.h"
#include "Setup.h"
class SCRIPT_DECL BuffNPC1 : public GossipScript
{
public:
void GossipHello(Object * pObject, Player* Plr, bool AutoSend);
void GossipSelectOption(Object * pObject, Player* Plr, uint32 Id, uint32 IntId, const char * Code);
void GossipEnd(Object * pObject, Player* Plr);
void Destroy()
{
delete this;
}
};
void BuffNPC1::GossipHello(Object * pObject, Player* Plr, bool AutoSend)
{
GossipMenu *Menu;
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
Menu->AddItem(0, "Level 10 Buffs - 1 Gold Each", 1);
Menu->AddItem(0, "Level 20 Buffs - 2 Gold Each", 2);
Menu->AddItem(0, "Level 30 Buffs - 3 Gold Each", 3);
Menu->AddItem(0, "Level 40 Buffs - 4 Gold Each", 4);
Menu->AddItem(0, "Level 50 Buffs - 5 Gold Each", 5);
if(AutoSend)
Menu->SendTo(Plr);
}
void BuffNPC1::GossipSelectOption(Object * pObject, Player* Plr, uint32 Id, uint32 IntId, const char * Code)
{
GossipMenu * Menu;
switch(IntId)
{
case 0: // Return to start
GossipHello(pObject, Plr, true);
break;
case 1:
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
if(Plr->getLevel() >= 10)
{
Menu->AddItem(5, "Strength", 8);
Menu->AddItem(5, "Intelligence", 9);
Menu->AddItem(5, "Stamina", 10);
Menu->AddItem(5, "Spirit", 11);
Menu->AddItem(5, "Agility", 12);
Menu->AddItem(5, "Protection", 43);
Menu->AddItem(0, "[Back]", 99);
Menu->SendTo(Plr);
}
else{
Plr->BroadcastMessage("You must be at least level 10 to use these buffs." );
}
}
break;
case 2:
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
if(Plr->getLevel() >= 20)
{
Menu->AddItem(5, "Strength", 13);
Menu->AddItem(5, "Intelligence", 14);
Menu->AddItem(5, "Stamina", 15);
Menu->AddItem(5, "Spirit", 16);
Menu->AddItem(5, "Agility", 17);
Menu->AddItem(5, "Protection", 44);
Menu->AddItem(0, "[Back]", 99);
Menu->SendTo(Plr);
}
else{
Plr->BroadcastMessage("You must be at least level 20 to use these buffs." );
}
}
break;
case 3:
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
if(Plr->getLevel() >= 30)
{
Menu->AddItem(5, "Strength", 18);
Menu->AddItem(5, "Intelligence", 19);
Menu->AddItem(5, "Stamina", 20);
Menu->AddItem(5, "Spirit", 21);
Menu->AddItem(5, "Agility", 22);
Menu->AddItem(5, "Protection", 45);
Menu->AddItem(0, "[Back]", 99);
Menu->SendTo(Plr);
}
else{
Plr->BroadcastMessage("You must be at least level 30 to use these buffs." );
}
}
break;
case 4:
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
if(Plr->getLevel() >= 40)
{
Menu->AddItem(5, "Strength", 23);
Menu->AddItem(5, "Intelligence", 24);
Menu->AddItem(5, "Stamina", 25);
Menu->AddItem(5, "Spirit", 26);
Menu->AddItem(5, "Agility", 27);
Menu->AddItem(5, "Protection", 46);
Menu->AddItem(0, "[Back]", 99);
Menu->SendTo(Plr);
}
else{
Plr->BroadcastMessage("You must be at least level 40 to use these buffs." );
}
}
break;
case 5:
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
if(Plr->getLevel() >= 50)
{
Menu->AddItem(5, "Strength", 28);
Menu->AddItem(5, "Intelligence", 29);
Menu->AddItem(5, "Stamina", 30);
Menu->AddItem(5, "Spirit", 31);
Menu->AddItem(5, "Agility", 32);
Menu->AddItem(5, "Protection", 47);
Menu->AddItem(0, "[Back]", 99);
Menu->SendTo(Plr);
}
else{
Plr->BroadcastMessage("You must be at least level 50 to use these buffs." );
}
}
break;
// Level 10
case 8: // Strength
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8118, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 9: // Intelligence
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8096, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 10: // Stamina
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8099, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 11: // Spirit
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8112, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 12: // Agility
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8115, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
// Level 20
case 13: // Strength
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8119, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 14: // Intelligence
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8097, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 15: // Stamina
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8100, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 16: // Spirit
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8113, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 17: // Agility
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8116, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
// Level 30
case 18: // Strength
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8120, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 19: // Intelligence
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8098, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 20: // Stamina
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8101, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 21: // Spirit
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8114, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 22: // Agility
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8117, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
// Level 40
case 23: // Strength
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12179, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 24: // Intelligence
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12176, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 25: // Stamina
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12178, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 26: // Spirit
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12177, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 27: // Agility
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12174, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
// Level 50
case 28: // Strength
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33082, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 29: // Intelligence
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33078, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 30: // Stamina
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33081, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 31: // Spirit
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33080, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 32: // Agility
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33077, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 43: // Protection
{
uint32 price=10000;// 1G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8091, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 44: // Protection
{
uint32 price=20000;// 2G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8094, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 45: // Protection
{
uint32 price=30000;// 3G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 8095, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 46: // Protection
{
uint32 price=40000;// 4G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 12175, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 47: // Protection
{
uint32 price=50000;// 5G
uint32 currentgold = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
if (currentgold>=price){
int32 newgold = currentgold - price;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE,newgold);
Plr->CastSpell(Plr, 33079, 0);
Plr->BroadcastMessage("You have been blessed!" );
}else{
Plr->BroadcastMessage("You don't have enough money ." );
}
}
break;
case 99: //main menu
{
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr);
Menu->AddItem(0, "Level 10 Buffs - 1 Gold Each", 1);
Menu->AddItem(0, "Level 20 Buffs - 2 Gold Each", 2);
Menu->AddItem(0, "Level 30 Buffs - 3 Gold Each", 3);
Menu->AddItem(0, "Level 40 Buffs - 4 Gold Each", 4);
Menu->AddItem(0, "Level 50 Buffs - 5 Gold Each", 5);
Menu->SendTo(Plr);
}
}
}
void BuffNPC1::GossipEnd(Object * pObject, Player* Plr)
{
GossipScript::GossipEnd(pObject, Plr);
}
void SetupBuffNPC1(ScriptMgr * mgr)
{
GossipScript * gs = (GossipScript*) new BuffNPC1();
mgr->register_item_gossip_script(40012,gs);
}
Here is the item's SQL format if you want it and the download link for the already compiled the DLL:
DLL: Filebeam - Free Fast File Hosting
Item ID: 40012
Thanks to spartansp for SQL mormat of the item.
SQL:
Code:
INSERT INTO `items` (`class`, `subclass`, `name1`, `name2`, `name3`, `name4`, `displayid`, `quality`, `buyprice`, `sellprice`, `itemlevel`, `ContainerSlots`, `unique`, `maxcount`, `bonding`, `stat_type1`, `stat_value1`, `stat_type2`, `stat_value2`, `stat_type3`, `stat_value3`, `stat_type4`, `stat_value4`, `stat_type5`, `stat_value5`, `stat_type6`, `stat_value6`, `stat_type7`, `stat_value7`, `stat_type8`, `stat_value8`, `dmg_min1`, `dmg_max1`, `dmg_type1`, `dmg_min2`, `dmg_max2`, `dmg_type2`, `dmg_min3`, `dmg_max3`, `dmg_type3`, `dmg_min4`, `dmg_max4`, `dmg_type4`, `dmg_min5`, `dmg_max5`, `dmg_type5`, `delay`, `range`, `holy_res`, `fire_res`, `nature_res`, `frost_res`, `shadow_res`, `arcane_res`, `armor`, `block`, `spellid_1`, `spelltrigger_1`, `spellcharges_1`, `spellcooldown_1`, `spellcategory_1`, `spellcategorycooldown_1`, `spellid_2`, `spelltrigger_2`, `spellcharges_2`, `spellcooldown_2`, `spellcategory_2`, `spellcategorycooldown_2`, `spellid_3`, `spelltrigger_3`, `spellcharges_3`, `spellcooldown_3`, `spellcategory_3`, `spellcategorycooldown_3`, `spellid_4`, `spelltrigger_4`, `spellcharges_4`, `spellcooldown_4`, `spellcategory_4`, `spellcategorycooldown_4`, `spellid_5`, `spelltrigger_5`, `spellcharges_5`, `spellcooldown_5`, `spellcategory_5`, `spellcategorycooldown_5`, `allowableclass`, `allowablerace`, `RequiredSkill`, `RequiredSkillRank`, `RequiredSkillSubRank`, `RequiredFaction`, `RequiredFactionStanding`, `requiredlevel`, `inventorytype`, `quest_id`, `sheathID`, `itemset`, `MaxDurability`, `Description`, `socket_color_1`, `socket_color_2`, `socket_color_3`, `socket_bonus`, `entry`) VALUES ('8', '-1', 'Portable Buffer', 'Portable Buffer', 'Portable Buffer', 'Portable Buffer', '42629', '1', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '33208', '0', '579', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1503', '1791', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Come on Buff ME!!!', '0', '0', '0', '0', '40012');