supreme coach[3.3.5]

Good night people come here today to contribute to the forums that have helped me a lot.

Come share my script with all.

Useful information Property:

Train all classes and races, no bug.

Coach class.

Supreme

TrinityCore revision 09/08/2014

Created by Me: ‘Cicero’

NOTE: This part of the code is not of my own!

"SkillLineAbilityMapBounds Limitador = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);

    for (SkillLineAbilityMap::const_iterator itr = Limitador.first; itr != Limitador.second; ++itr)

    {

        if (itr->second->spellId == spellInfo->Id && itr->second->racemask == 0 && itr->second->AutolearnType == 0)

        {

            validarAbilidades = true;

            SpellInfo const* prevSpell = spellInfo->GetPrevRankSpell();

            if (prevSpell && !player->HasSpell(prevSpell->Id))

            {

                validarAbilidades = false;

                break;

            }

            if (GetTalentSpellPos(itr->second->spellId))

            if (!prevSpell || !player->HasSpell(prevSpell->Id) || spellInfo->GetRank() == 1)

                validarAbilidades = false;

            break;

        }

    }"

I pulled this core: https://github.com/codels/TrinityNya

The rest is of my own …

http://s22.postimg.org/3vbzudat9/Wo_WScrn_Shot_091214_150827.jpg

Code:

/*
Treinador de class.
Supremo,
TrinityCore revisão 08/09/2014
Criado por Mim: ‘Cicero’
OBS: Esta parte do código não é da minha autoria!

“SkillLineAbilityMapBounds Limitador = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
for (SkillLineAbilityMap::const_iterator itr = Limitador.first; itr != Limitador.second; ++itr)
{
if (itr->second->spellId == spellInfo->Id && itr->second->racemask == 0 && itr->second->AutolearnType == 0)
{
validarAbilidades = true;
SpellInfo const* prevSpell = spellInfo->GetPrevRankSpell();
if (prevSpell && !player->HasSpell(prevSpell->Id))
{
validarAbilidades = false;
break;
}
if (GetTalentSpellPos(itr->second->spellId))
if (!prevSpell || !player->HasSpell(prevSpell->Id) || spellInfo->GetRank() == 1)
validarAbilidades = false;
break;
}
}”
Eu retirei deste core: https://github.com/codels/TrinityNya
O restante é da minha autoria…

SET @TSUPREMO = 900030;
DELETE FROM creature_template WHERE entry = @TSUPREMO;
INSERT INTO creature_template (entry, modelid1, name, subname, minlevel, maxlevel, exp, faction, npcflag, scale, unit_class, trainer_type, trainer_spell, trainer_class, trainer_race, type, ScriptName) VALUES
(@TSUPREMO,‘18998’,‘Treinador Supremo’,‘by Cicero’,‘1’,‘80’,‘2’,‘35’,‘177’,‘0.4’,‘128’,‘1’,‘0’,‘0’,‘0’,‘2’,‘npc_treinador_supremo’);

SET @TSUPREMO = 900030;
– OBS: Só pode aplicar o creature_addon depois de adicionar a o npc no mapa.
SET @GUID := (SELECT MIN(guid) FROM creature WHERE id = @TSUPREMO);
DELETE FROM creature_addon WHERE guid = @GUID;

INSERT INTO creature_addon (guid, bytes2, auras) VALUES
(@GUID,‘4097’,‘46934’);

REPLACE INTO npc_text (ID, text0_0) VALUES
(‘11110’,‘Ola |cff1E90FF$n:|rrnBem Vindo(a) aornSupremo…Trenador.rnOBS: Lebre-se de quando distribuir seus talentos voltar aqui para treinar as spells restantes.’);
*/

#include “ScriptPCH.h”
#include “Language.h”
#include “Config.h”

int TRENADOR_ORIGINAL = 1; // 1 = Sumona Treinador e o segue. Não requer script multitreiner. 2 = abre Menu Treinador original. Requer script multitrainer

enum
{
TSUPREMO = 19910,
SAIR = 19920,
RESETAR__TALENTOS = 19930,
DUAL_ESPECIALIZACAO = 19940,
TREINADOR_ORIGINAL_SPELLSUMMON = 19950,
TREINADOR_MENU_ORIGINAL = 19960,
GLYPH_NPC_VENDOR = 19970
};

uint32 SI[] = {
64380, 23885, 23880, 44461, 25346, 10274, 10273, 8418, 8419, 7270, 7269, 7268, 54648, 12536, 24530, 70909,
12494, 57933, 24224, 27095, 27096, 27097, 27099, 32841, 56131, 56160, 56161, 48153, 34754, 64844, 64904, 48085,
33110, 48084, 28276, 27874, 27873, 7001, 49821, 53022, 47757, 47750, 47758, 47666, 53001, 52983, 52998, 52986,
52987, 52999, 52984, 53002, 53003, 53000, 52988, 52985, 42208, 42209, 42210, 42211, 42212, 42213, 42198, 42937,
42938, 12484, 12485, 12486, 44461, 55361, 55362, 34913, 43043, 43044, 38703, 38700, 27076, 42844, 42845, 64891,
25912, 25914, 25911, 25913, 25902, 25903, 27175, 27176, 33073, 33074, 48822, 48820, 48823, 48821, 20154, 25997,
20467, 20425, 67, 26017, 34471, 53254, 13812, 14314, 14315, 27026, 49064, 49065, 60202, 60210, 13797, 14298,
14299, 14300, 14301, 27024, 49053, 49054, 52399, 1742, 24453, 53548, 53562, 52016, 26064, 35346, 57386, 57389,
57390, 57391, 57392, 57393, 55509, 35886, 43339, 45297, 45298, 45299, 45300, 45301, 45302, 49268, 49269, 8349,
8502, 8503, 11306, 11307, 25535, 25537, 61650, 61654, 63685, 45284, 45286, 45287, 45288, 45289, 45290, 45291,
45292, 45293, 45294, 45295, 45296, 49239, 49240, 26364, 26365, 26366, 26367, 26369, 26370, 26363, 26371, 26372,
49278, 49279, 32176, 32175, 21169, 47206, 27285, 47833, 47836, 42223, 42224, 42225, 42226, 42218, 47817, 47818,
42231, 42232, 42233, 42230, 48466, 44203, 44205, 44206, 44207, 44208, 48444, 48445, 33891, 52374, 57532, 59921,
52372, 49142, 52375, 47633, 47632, 52373, 50536, 27214, 47822, 11682, 11681, 5857, 1010, 24907, 24905, 53227,
61391, 61390, 61388, 61387, 64801, 5421, 9635, 1178, 20186, 20185, 20184, 20187, 25899, 24406, 50581, 30708,
8946, 42459, 23455, 48076
};
uint32 SR[][99]
{ // Warrior
{ 3127, 264, 266, 5011, 15590, 200, 227, 2567, 674, 750, 12678 },
//DK
{ 198, 199, 3714, 53323, 53331, 53341, 53342, 53343, 53344, 54446, 54447, 62158, 70164 },
//Druid
{ 15590, 200, 5225, 20719, 62600 },
// Hunter
{ 674, 42459, 8737, 15590, 2567, 227, 266, 5011, 200, 201, 1462, 3127, 6197, 19885 },
// mage
{ 1180, 201, /Alliance->/ 3562, 3561, 3565, 11416, 11419, 32266, 32271, 33690, 33691, 49359, 49360, /Horde->/ 3563, 3566, 3567, 11417, 11418, 11420, 32272, 35715, 35717, 32267, 49358, 49361 },
//==Fim spell Mage======================================================================
// paladin
{ 750, 200, 196, 197, 3127 },
//Rogue
{ 264, 15590, 5011, 201, 196, 198, 3127, 2836 },
//Shaman
{ 8737, 1180, 15590, 196, 197, 199, 6196, 66842, 66843, 66844 },
//Warlock
{ 201, 5500, 5784, 29858, 33388, 47836 },
};

std::vector SpellsIguinorar = std::vector(SI, SI + sizeof(SI) / sizeof(SI[0]));

bool GetIguinorarSpells(uint32 IDspell)
{
for (std::vector::const_iterator itr = SpellsIguinorar.begin(); itr != SpellsIguinorar.end(); ++itr)
if (IDspell == (itr))
return true;
return false;
}
bool SpellRestantes(Player
player, uint32 SpellClasses)
{
uint8 pLevel = player->getLevel() + 1;
switch (SpellClasses = player->getClass())
{
case CLASS_WARRIOR:
for (int i = 0; i < 11; i++)
{
player->LearnSpell(SR[0][i], false);
}
if (player->HasSpell(12294))
player->LearnSpell(47486, false);

	if (player->HasSpell(20243))
		player->LearnSpell(47498, false);

	break;
case CLASS_DEATH_KNIGHT:
	for (int i = 0; i < 13; i++)
	{
		player->LearnSpell(SR[1][i], false);
	}
	if (player->HasSpell(55050)) //Heart Strike Rank 1
		player->LearnSpell(55262, false);

	if (player->HasSpell(49143)) //Frost Strike Rank 1
		player->LearnSpell(55268, false);

	if (player->HasSpell(49184)) //Howling Blast Rank 1
		player->LearnSpell(51411, false);

	if (player->HasSpell(55090)) //Scourge Strike Rank 1
		player->LearnSpell(55271, false);

	if (player->HasSpell(49158)) //Corpse Explosion Rank 1
		player->LearnSpell(51328, false);

	if (player->GetFreeTalentPoints() == +25){
		player->CastSpell(player, 26410, false);
		player->ResetTalents();
		player->SetFreeTalentPoints(71);
		player->SendTalentsInfoData(false);
	}
	break;
case CLASS_DRUID:
	for (int i = 0; i < 5; i++)
	{
		player->LearnSpell(SR[2][i], false);
	}
	if (player->HasSpell(50516)) //Typhoon Rank 1
		player->LearnSpell(61384, false);

	if (player->HasSpell(48505)) //Starfall Rank 1
		player->LearnSpell(53201, false);

	if (player->HasSpell(5570)) //Insect Swarm Rank 1
		player->LearnSpell(48468, false);

	if (player->HasSpell(48438)) //Wild Growth Rank 1
		player->LearnSpell(53251, false);

	if (player->HasSpell(33876) && player->HasSpell(33878) && player->HasSpell(33917))
	{
		player->LearnSpell(48564, false);
		player->LearnSpell(48566, false);
	}
	if (player->HasSpell(5487))
		player->LearnSpell(9634, false);
	break;
case CLASS_HUNTER:
	for (int i = 0; i < 14; i++)
	{
		player->LearnSpell(SR[3][i], false);
	}
	if (player->HasSpell(19386)) //Wyvern String Rank 1
		player->LearnSpell(49012, false);

	if (player->HasSpell(53301)) //Explosive Shot Rank 1
		player->LearnSpell(60053, false);

	if (player->HasSpell(19306)) //Conter Attack Rank 1
		player->LearnSpell(48999, false);

	if (player->HasSpell(19434)) //Aimed Shot Rank 1
		player->LearnSpell(49050, false);
	break;
case CLASS_MAGE:
	for (int i = 0; i < 25; i++)
	{
		SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SR[4][i]);
		if (!spellInfo)	continue;
		if (!(pLevel > spellInfo->SpellLevel)) continue;

		if (!player->GetSession()->GetPlayer()->IsSpellFitByClassAndRace(SR[4][i])) continue;

		player->LearnSpell(SR[4][i], false);
	}
	if (player->HasSpell(44425)) //Arcane Barrage Rank 1
		player->LearnSpell(44781, false);

	if (player->HasSpell(11113)) //Blast Wave Rank 1
		player->LearnSpell(42945, false);

	if (player->HasSpell(31661)) //Dragon Breath  Rank 1
		player->LearnSpell(42950, false);

	if (player->HasSpell(44457)) //Living Bomb Rank 1
		player->LearnSpell(55360, false);

	if (player->HasSpell(11366)) //Pyroblast Rank 1
		player->LearnSpell(42891, false);

	if (player->HasSpell(11426)) //Ice Barrier Rank 1
		player->LearnSpell(43039, false);

	break;
case CLASS_PALADIN:
	for (int i = 0; i < 5; i++)
	{
		player->LearnSpell(SR[5][i], false);
	}
	if (player->GetTeam() == ALLIANCE) // spell só para alliance
	{
		player->LearnSpell(31801, false);
		player->LearnSpell(13819, false);
		player->LearnSpell(23214, false);
	}
	else{ // spell só para Horde
		player->LearnSpell(53736, false);
		player->LearnSpell(34769, false);
		player->LearnSpell(34767, false);
	}
	if (player->HasSpell(20925)) //Holy Shield Rank 1
		player->LearnSpell(48952, false);

	if (player->HasSpell(20473)) //Holy Shock Rank 1
		player->LearnSpell(48825, false);

	if (player->HasSpell(31935)) //Avengers Shield Rank 1
		player->LearnSpell(48827, false);

	if (player->HasSpell(20911)) //Blessing of Sanctuary Rank 1
		player->LearnSpell(25899, false);

	/* Devido ao bug de paladin nesta nova core que tem duas [Seal of Righteousness] 
	Não achei outra  forma de resolver este bug dessa nova core 11/09/2014.
	Esta spell abaixo é somente para remover o bug dessa core 11/09/2014. As cores anteriores não tem este bug.
	*/		// Remover Bug: [Seal of Righteousness]
	player->RemoveSpell(20154, true); // este comando dever ser retirada se aplica este script em outras cores.
	break;
case CLASS_PRIEST:
	if (player->HasSpell(34914)) //Vampiric Touch Rank 1
		player->LearnSpell(48160, false);

	if (player->HasSpell(47540)) //Penance Rank 1
		player->LearnSpell(53007, false);

	if (player->HasSpell(724)) //LightWell Rank 1
		player->LearnSpell(48087, false);

	if (player->HasSpell(19236)) //Desperate Prayer Rank 1
		player->LearnSpell(48173, false);

	if (player->HasSpell(34861)) //Circle Of healing Rank 1
		player->LearnSpell(48089, false);

	if (player->HasSpell(15407)) //Mind Flay Rank 1
		player->LearnSpell(48156, false);

	player->LearnSpell(1180, false); // Weapon Daggers
	break;
case CLASS_ROGUE:
	for (int i = 0; i < 6; i++)
	{
		player->LearnSpell(SR[6][i], false);
	}
	if (player->HasSpell(16511)) //Hemorrhage Rank 1
		player->LearnSpell(48660, false);

	if (player->HasSpell(1329)) //Mutilate Rank 1
		player->LearnSpell(48666, false);
	break;
case CLASS_SHAMAN:
	for (int i = 0; i < 10; i++)
	{
		player->LearnSpell(SR[7][i], false);
	}
	if (player->GetTeam() == ALLIANCE)
	{
		player->LearnSpell(32182, false);
	}
	else{ // Horde
		player->LearnSpell(2825, false);
	}
	if (player->HasSpell(61295)) //Riptide Rank 1
		player->LearnSpell(61301, false);

	if (player->HasSpell(974)) //Earth Shield Rank 1
		player->LearnSpell(49284, false);

	if (player->HasSpell(30706)) //Totem of Wrath Rank 1
		player->LearnSpell(57722, false);

	if (player->HasSpell(51490)) //TunderStorm Rank 1
		player->LearnSpell(59159, false);
	break;
case CLASS_WARLOCK:
	for (int i = 0; i < 6; i++)
	{
		player->LearnSpell(SR[8][i], false);
	}
	if (player->HasSpell(17877)) //ShadowBurn Rank 1
		player->LearnSpell(47827, false);

	if (player->HasSpell(30283)) //ShadowFury Rank 1
		player->LearnSpell(47847, false);

	if (player->HasSpell(50796)) //Chaos Bolt Rank 1
		player->LearnSpell(59172, false);

	if (player->HasSpell(30108)) //Unstable Affliction Rank 1
		player->LearnSpell(47843, false);

	if (player->HasSpell(48181)) //Spell Haunt Rank 1
		player->LearnSpell(59164, false);

	if (player->HasSpell(18220)) //Dark Pact Rank 1
		player->LearnSpell(59092, false);
	break;
default:
	break;
}
return true;

}

bool TreinadorSupremo(Player* player, uint8 plevelup)
{
if (plevelup == player->getLevel() + 1)
return true;
ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(player->GetSession()->GetPlayer()->getClass());
if (!classEntry)
return true;
uint32 family = classEntry->spellfamily;

for (uint32 i = 0; i < sSkillLineAbilityStore.GetNumRows(); ++i)
{
	SkillLineAbilityEntry const* entry = sSkillLineAbilityStore.LookupEntry(i);
	if (!entry)
		continue;

	SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(entry->spellId);
	if (!spellInfo)	continue;

	// skip server-side/triggered spells
	if (spellInfo->SpellLevel == 0)	continue;

	// skip wrong class/race skills
	if (!player->GetSession()->GetPlayer()->IsSpellFitByClassAndRace(spellInfo->Id)) continue;

	// skip other spell families
	if (spellInfo->SpellFamilyName != family) continue;

	// Pulas spells não validas ou spell de talentos que não poder ser treinado de imediato 
	// OBS: Lembre de quando distripuir seus talentos volte no npc para treinar as spell de talentos... 
	if (GetIguinorarSpells(spellInfo->Id))	continue;

	// skip spells with first rank learned as talent (and all talents then also)
	if (GetTalentSpellCost(spellInfo->GetFirstRankSpell()->Id) > 0)	continue;

	// skip broken spells
	if (!SpellMgr::IsSpellValid(spellInfo, player->GetSession()->GetPlayer(), false)) continue;

	// Spell Restante e Spell de Talentos
	if (!SpellRestantes(player, plevelup)) continue;
			
	// Não inclui Teleports, mounts and other spells.
	if ((spellInfo->AttributesEx7 & SPELL_ATTR7_HORDE_ONLY && player->GetTeam() != HORDE)
		|| (spellInfo->AttributesEx7 & SPELL_ATTR7_ALLIANCE_ONLY && player->GetTeam() != ALLIANCE)) continue;

	// Add spell de acordo com o level. Skip spell level inválido
	if (spellInfo->BaseLevel != plevelup && sSpellMgr->IsSpellValid(spellInfo, player)) continue;

	bool validarAbilidades = false;
	SkillLineAbilityMapBounds Limitador = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
	for (SkillLineAbilityMap::const_iterator itr = Limitador.first; itr != Limitador.second; ++itr)
	{
		if (itr->second->spellId == spellInfo->Id && itr->second->racemask == 0 && itr->second->AutolearnType == 0)
		{
			validarAbilidades = true;
			SpellInfo const* prevSpell = spellInfo->GetPrevRankSpell();
			if (prevSpell && !player->HasSpell(prevSpell->Id))
			{
				validarAbilidades = false;
				break;
			}
			if (GetTalentSpellPos(itr->second->spellId))
			if (!prevSpell || !player->HasSpell(prevSpell->Id) || spellInfo->GetRank() == 1)
				validarAbilidades = false;
			break;
		}
	} 
	if (validarAbilidades){ 
		if (player->HasSpell(spellInfo->Id)) continue;
		player->GetSession()->GetPlayer()->LearnSpell(spellInfo->Id, false);
	}
}
TreinadorSupremo(player, ++plevelup); // Add spell de acordo com o level
player->SaveToDB();

player->CastSpell(player, 47445, false); // Spell só para visual		
return true;

}

// Tempo para summonar a próxima vez
std::map<uint32, uint32> MemoriaTempo;
uint32 Minutos = 3;
uint32 CalculateMinutos(uint32 m_time)
{
if (m_time <= 60000)
Minutos = 1;
else if (m_time <= 120000)
Minutos = 2;
else if (m_time <= 180000) // 180000 = 3 minutes
Minutos = 3;

return Minutos;
}

// Não requer MultiTrainer nem MultiVendor
void SumonarTrainerOriginais(Player* player, Creature* _creature, uint32 TreinadorClasses)
{
bool SumonarEM = true;
if (!MemoriaTempo.empty())
{
std::map<uint32, uint32>::iterator itr = MemoriaTempo.find(player->GetGUIDLow());
if (itr != MemoriaTempo.end())
if (GetMSTimeDiffToNow(itr->second) < 60000) // 3 minutos = 180000 | 2 minutos = 120000 | 1 minutos = 60000 e etc.
{
ChatHandler(player->GetSession()).PSendSysMessage(“|cffFF0000Espere %u minuto(s) para poder summonar novamente.|r”, CalculateMinutos(GetMSTimeDiffToNow(itr->second)));
SumonarEM = false;
}
else
{
MemoriaTempo.erase(player->GetGUIDLow());
SumonarEM = true;
}
}
// Tempo em que o npc fica sumonado e te seguinto
uint32 TEMPO__SUMMON = 60000; // 3 minutos = 180000 | 2 minutos = 120000 | 1 minutos = 60000 e etc.

float x, y, z;
player->GetPosition(x, y, z);

#define summDruid player->SummonCreature(26324, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summHunter player->SummonCreature(26325, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summMage player->SummonCreature(26326, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summPaladin player->SummonCreature(26327, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summPriest player->SummonCreature(26328, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summRogue player->SummonCreature(26329, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summShaman player->SummonCreature(26330, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summWarlock player->SummonCreature(26331, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summWarrioR player->SummonCreature(26332, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define summDK player->SummonCreature(28474, x, y-1, z, +1, TEMPSUMMON_TIMED_DESPAWN, TEMPO__SUMMON)
#define MeSeguir GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, _creature->GetFollowAngle() + 8)

player->PlayerTalkClass->ClearMenus();
if (SumonarEM){
	MemoriaTempo[player->GetGUIDLow()] = getMSTime();

	switch (TreinadorClasses = player->getClass())
	{
	case CLASS_WARRIOR:
		summWarrioR->MeSeguir;			
		_creature->CastSpell(player, 44328, false); 
		break;
	case CLASS_PALADIN:
		summPaladin->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_DEATH_KNIGHT:
		summDK->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_DRUID:
		summDruid->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_HUNTER:
		summHunter->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_MAGE:
		summMage->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_PRIEST:
		summPriest->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_ROGUE:
		summRogue->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_WARLOCK:
		summWarlock->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;
	case CLASS_SHAMAN:
		summShaman->MeSeguir;
		_creature->CastSpell(player, 44328, false);
		break;

	default:
		return;
	}
}
return;
/*
player->CastSpell(player, 47359, false); // Trenador Druid
player->CastSpell(player, 47360, false); // Trenador Hunter
player->CastSpell(player, 47361, false); // Tranador Mage
player->CastSpell(player, 47362, false); // Tranador Paladin
player->CastSpell(player, 47363, false); // Tranador Priest
player->CastSpell(player, 47364, false); // Tranador Rogue
player->CastSpell(player, 47365, false); // Tranador Shaman
player->CastSpell(player, 47366, false); // Tranador Warlock
player->CastSpell(player, 47367, false); // Trenador WarrioR
*/

}
// Menu Trenadores Originais: Requer MultiTrainer
/*
void TrenadoresOriginais(Player* player, Creature* creature, uint8 TrainerClass)
{
uint8 GetRace = player->GetTeam() == ALLIANCE;

switch (TrainerClass = player->getClass())
{
case CLASS_WARRIOR:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 914);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 3408);
	break;
case CLASS_PALADIN:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5491);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 23128);
	break;
case CLASS_DEATH_KNIGHT:
	player->GetSession()->SendTrainerList(creature->GetGUID(), 28474);// Todos
	break;
case CLASS_DRUID:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5504);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 16655);
	break;
case CLASS_HUNTER:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5515);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 3352);
	break;
case CLASS_MAGE:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5498);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 5885);
	break;
case CLASS_PRIEST:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5489);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 6018);
	break;
case CLASS_ROGUE:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 13283);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 3328);
	break;
case CLASS_SHAMAN:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 20407);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 3344);
	break;
case CLASS_WARLOCK:
	if (GetRace)
		player->GetSession()->SendTrainerList(creature->GetGUID(), 5496);//Alliance
	player->GetSession()->SendTrainerList(creature->GetGUID(), 3325);
	break;
}
return;

}
// Glyphs_Vendedor: Requer MultiVendor
bool VendedorGlyphs(Player* player, Creature* creature, uint32 PguidClass)
{
switch (PguidClass = player->getClass())
{
case CLASS_WARRIOR:
player->GetSession()->SendListInventory(creature->GetGUID(), 99901);
break;
case CLASS_PALADIN:
player->GetSession()->SendListInventory(creature->GetGUID(), 99902);
break;
case CLASS_MAGE:
player->GetSession()->SendListInventory(creature->GetGUID(), 99903);
break;
case CLASS_HUNTER:
player->GetSession()->SendListInventory(creature->GetGUID(), 99904);
break;
case CLASS_DRUID:
player->GetSession()->SendListInventory(creature->GetGUID(), 99905);
break;
case CLASS_WARLOCK:
player->GetSession()->SendListInventory(creature->GetGUID(), 99906);
break;
case CLASS_PRIEST:
player->GetSession()->SendListInventory(creature->GetGUID(), 99907);
break;
case CLASS_ROGUE:
player->GetSession()->SendListInventory(creature->GetGUID(), 99908);
break;
case CLASS_DEATH_KNIGHT:
player->GetSession()->SendListInventory(creature->GetGUID(), 99909);
break;
case CLASS_SHAMAN:
player->GetSession()->SendListInventory(creature->GetGUID(), 99910);
break;
}
return true;
}
*/
class npc_treinador_supremo : public CreatureScript
{
public:
npc_treinador_supremo() : CreatureScript(“npc_treinador_supremo”) {}

bool OnGossipHello(Player* player, Creature* creature)
{
	player->PlayerTalkClass->ClearMenus();
	creature->CastSpell(creature, 44342, false); //visual
	if (player->IsInCombat())
	{
		player->CLOSE_GOSSIP_MENU();
		ChatHandler(player->GetSession()).SendSysMessage("|cffFF0000Voce esta em combate!|r");
	}
	else{			
		player->ADD_GOSSIP_ITEM(3, "|cff008B8B|TInterfaceiconsINV_Sigil_UlduarAll:30|tTreinar Spell|r", GOSSIP_SENDER_MAIN, TSUPREMO);

		if (TRENADOR_ORIGINAL == 1)
			player->ADD_GOSSIP_ITEM(3, "|cffFF0000|TInterfaceiconsINV_Sigil_Mimiron:30|t  Treinadores Originais SetSumm|r", GOSSIP_SENDER_MAIN, TREINADOR_ORIGINAL_SPELLSUMMON); //não requer script muitTrainer

		if (TRENADOR_ORIGINAL == 2)
			player->ADD_GOSSIP_ITEM(3, "|cffFF0000|TInterfaceiconsAbility_Vehicle_LaunchPlayer:30|t Trenadores Originais SetMenu|r", GOSSIP_SENDER_MAIN, TREINADOR_MENU_ORIGINAL); //requer script muitTrainer

		player->ADD_GOSSIP_ITEM_EXTENDED(3, "|cffCD2626|TInterfaceiconsAbility_DualWield:30|t Especializacao Talentos Duplos|r", GOSSIP_SENDER_MAIN, DUAL_ESPECIALIZACAO, "Voce tem certesa que quer compranEspecializacao Telentos Duplosn", 3 * GOLD, false);
//		player->ADD_GOSSIP_ITEM(3, "|cffFF0000|TInterfaceiconsINV_Inscription_MinorGlyph20:30|t Comprar Glyphs|r", GOSSIP_SENDER_MAIN, GLYPH_NPC_VENDOR); //Requer script MultiVendor
		player->ADD_GOSSIP_ITEM(4, "|cffFF0000|TInterfaceiconsAchievement_BG_hld4bases_EOS:40|t Resetar Talentos|r", GOSSIP_SENDER_MAIN, RESETAR__TALENTOS);

		player->ADD_GOSSIP_ITEM(8, "|cffFF0000|TInterfaceiconsAbility_Hunter_MarkedForDeath:20|t Sair", GOSSIP_SENDER_MAIN, SAIR);
		player->SEND_GOSSIP_MENU(1, creature->GetGUID());
		player->PlayerTalkClass->SendGossipMenu(11110, creature->GetGUID());
	}
	return true;		
}
bool OnGossipSelect(Player* player, Creature* _creature, uint32 uiSender, uint32 action)
{
	switch (action)
	{
	case TSUPREMO:
		_creature->CastSpell(player, 26410, false); // Spell só para visual
		TreinadorSupremo(player, action);
		player->CLOSE_GOSSIP_MENU();
		break;
	case TREINADOR_MENU_ORIGINAL:
		//	TrenadoresOriginais(player, _creature, action);
		ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000 Requer Script MultiTrainer|r");
		break;
	case TREINADOR_ORIGINAL_SPELLSUMMON:
		SumonarTrainerOriginais(player, _creature, action);
		player->CLOSE_GOSSIP_MENU();
		break;
	case GLYPH_NPC_VENDOR:
	//	VendedorGlyphs(player,_creature, action);
		ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000 Requer Script MultiVendor|r");
		player->CLOSE_GOSSIP_MENU();
		break;
	case RESETAR__TALENTOS:
		if (player->GetFreeTalentPoints() == +player->CalculateTalentsPoints()){
			ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000Seus talentos ja estam resetados!|r");
			player->CLOSE_GOSSIP_MENU();
		}
		else
		{												
			// ResetPetTalents();
			if (player->getClass() == CLASS_DEATH_KNIGHT)
			{						// == 80
				if (player->getLevel() == sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)){
					player->ResetTalents();
					player->SetFreeTalentPoints(71);
					player->SendTalentsInfoData(false);
					player->CLOSE_GOSSIP_MENU();
				}
				else{
					player->ResetTalents();
					player->SetFreeTalentPoints(player->CalculateTalentsPoints());
					ChatHandler(player->GetSession()).PSendSysMessage("|cff00FF00Talentos resetados com sucesso!|r");
					player->SendTalentsInfoData(false);
					_creature->CastSpell(player, 17251, false);
				}
			}
			else{
				player->ResetTalents();
				player->SetFreeTalentPoints(player->CalculateTalentsPoints());
				ChatHandler(player->GetSession()).PSendSysMessage("|cff00FF00Talentos resetados com sucesso!|r");
				player->SendTalentsInfoData(false);
				_creature->CastSpell(player, 17251, false);
			}
			player->SaveToDB();
			player->CLOSE_GOSSIP_MENU();
		}
		break;
	case DUAL_ESPECIALIZACAO:
		if (player->GetSpecsCount() == 1)
		{
			if (player->getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
			{
				if (player->GetMoney() >= 3 * GOLD){ // 30.000 = 3k
					player->CastSpell(player, 63680, false, NULL, NULL, player->GetGUID()); //63651 para tirar
					player->CastSpell(player, 63624, true, NULL, NULL, player->GetGUID());
					player->CLOSE_GOSSIP_MENU();
					ChatHandler(player->GetSession()).PSendSysMessage("|cffFFFFFFEspecializacao Talentos Duplos adiquirida com sucesso!|r");
					player->SaveToDB();
				}
				else
				{
					ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000Voce presisa de|r %u |cffFF0000de GOLD  para comprar Especializacao Talentos Duplos|r", 3 * GOLD);
					player->CLOSE_GOSSIP_MENU();
				}
			}
			else
			{
				ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000Voce so pode pegar Especializacao Talentos Duplos apartido level|r %u", sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL));
				player->CLOSE_GOSSIP_MENU();
			}
		}
		else
		{
			ChatHandler(player->GetSession()).PSendSysMessage("|cffFF0000Voce ja tem Especializacao Talentos Duplos|r");
			player->CLOSE_GOSSIP_MENU();
		}
		break;		
	case SAIR:
		player->CLOSE_GOSSIP_MENU();
		break;
		return true;
	}


	return true;
}

};
void UpdateCreatureTrainerSummon(){
uint32 UpdateCreature[][2] =
{
{ 4475, 26324 }, // druid
{ 4474, 26325 }, // hunter
{ 4484, 26326 }, //mage
{ 4469, 26327 }, // paladin
{ 4467, 26328 }, //priest
{ 5061, 26329 }, // rogue
{ 8110, 26330 }, //shaman
{ 4504, 26331 }, //warlock
{ 4475, 26332 }, // warrior
{ 9693, 28474 }, // Dk
};
for (uint8 i = 0; i < 10; i++)
{
WorldDatabase.PExecute(“UPDATE creature_template SET modelid1 = ‘18998’, gossip_menu_id = ‘%u’, scale = ‘0.1’ WHERE entry = ‘%u’”, UpdateCreature[i][0], UpdateCreature[i][1]);
} // TC_LOG_INFO(“server.loading”, “Atualizando creature trainer…”);
}
class npc_treinador_supremo_WorldScript : public WorldScript
{
public:
npc_treinador_supremo_WorldScript() : WorldScript(“npc_treinador_supremo_WorldScript”) { }

void LoadDataFromDataBase()
{
	UpdateCreatureTrainerSummon();
}

void OnConfigLoad(bool)
{
	LoadDataFromDataBase();
}

};

void AddSC_npc_treinador_supremo()
{
new npc_treinador_supremo();
new npc_treinador_supremo_WorldScript();
}
Script MultiTrainer and multivendor and GissipMenuPlayer:adapitado to core:

TrinityCore revision 09/08/2014

Caught this site scripting ac-web

only adapted

is not of my authorship

http://www.4shared.com/file/2rDWutYPce/script_multitrainer_and_multiv.html