Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mindsear
Created November 16, 2020 00:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mindsear/44ec4646ffc3d4d80335ece83df32770 to your computer and use it in GitHub Desktop.
Save mindsear/44ec4646ffc3d4d80335ece83df32770 to your computer and use it in GitHub Desktop.
Updated Npc_beastmaster for the latest TC 3.3.5 (as of 15-Nov-2020)
#include "CreatureAI.h"
#include "TemporarySummon.h"
#include "Pet.h"
#include "ScriptedGossip.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedGossip.h"
#include "ScriptedCreature.h"
#include "Player.h"
#include "Unit.h"
#include "Pet.h"
#include "WorldSession.h"
#include "World.h"
/*
Use world;
INSERT INTO `creature_template` VALUES (50000, 0, 0, 0, 0, 0, 3395, 0, 0, 0, 'NPC Beastmaster', 'Hunter Trainer', 'Trainer', 0, 80, 80, 0, 35, 1, 1, 1.14286, 1, 4, 0, 1500, 2000, 1, 1, 1, 0, 2048, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 66, 'Npc_Beastmaster', 12340);
*/
#define GOSSIP_ITEM_STABLE "Stable"
#define GOSSIP_ITEM_NEWPET "New Pet"
#define GOSSIP_ITEM_BOAR "Boar"
#define GOSSIP_ITEM_SERPENT "Serpent"
#define GOSSIP_ITEM_SCRAB "Scrab"
#define GOSSIP_ITEM_LION "Lion"
#define GOSSIP_ITEM_WOLF "Wolf"
#define GOSSIP_ITEM_RAVAGER "Ravenger"
#define GOSSIP_ITEM_UNTRAINEPET "Restart Pet"
class Npc_Beastmaster : public CreatureScript
{
public:
Npc_Beastmaster() : CreatureScript("Npc_Beastmaster") { }
struct Npc_BeastmasterAI : public ScriptedAI
{
Npc_BeastmasterAI(Creature* creature) : ScriptedAI(creature) { }
void CreatePet(Player* player, Creature* m_creature, uint32 entry) {
if (player->GetClass() != CLASS_HUNTER) {
m_creature->Whisper("You are not a Hunter!", LANG_UNIVERSAL, player, false);
player->PlayerTalkClass->SendCloseGossip();
return;
}
if (player->GetPet()) {
m_creature->Whisper("First you must drop your pet!", LANG_UNIVERSAL, player, false);;
player->PlayerTalkClass->SendCloseGossip();
return;
}
Creature* creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY() + 2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min);
if (!creatureTarget) return;
Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0);
if (!pet)
return;
// kill original creature
creatureTarget->setDeathState(JUST_DIED);
creatureTarget->RemoveCorpse();
creatureTarget->SetHealth(0); // just for nice GM-mode view
pet->SetPower(POWER_HAPPINESS, 1048000);
//pet->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0);
//pet->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(70))/4));
// prepare visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->GetLevel() - 1);
pet->GetMap()->AddToMap(pet->ToCreature());
// visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->GetLevel());
if (!pet->InitStatsForLevel(player->GetLevel()))
// sLog->outError("Pet Create fail: no init stats for entry %u", entry);
pet->UpdateAllStats();
// caster have pet now
player->SetMinion(pet, true);
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
pet->InitTalentForLevel();
player->PetSpellInitialize();
//end
player->PlayerTalkClass->SendCloseGossip();
m_creature->Whisper("Pet added!", LANG_UNIVERSAL, player, false);;
}
bool OnGossipHello(Player* player) override
{
if (player->GetClass() != CLASS_HUNTER)
{
me->Whisper("You are not a Hunter!", LANG_UNIVERSAL, player, false);
return true;
}
AddGossipItemFor(player, GOSSIP_ICON_BATTLE, "Get a New Pet.", GOSSIP_SENDER_MAIN, 30);
if (player->CanTameExoticPets())
{
AddGossipItemFor(player, GOSSIP_ICON_BATTLE, "Get a New Exotic Pet.", GOSSIP_SENDER_MAIN, 50);
}
AddGossipItemFor(player, 2, "Take me to the Stable.", GOSSIP_SENDER_MAIN, GOSSIP_OPTION_STABLEPET);
AddGossipItemFor(player, 6, "Sell me some Food for my Pet.", GOSSIP_SENDER_MAIN, GOSSIP_OPTION_VENDOR);
AddGossipItemFor(player, 5, "Close Beastmaster Window.", GOSSIP_SENDER_MAIN, 150);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId)
{
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
ClearGossipMenuFor(player);
switch (action)
{
case 100:
AddGossipItemFor(player, 4, "Get a New Pet.", GOSSIP_SENDER_MAIN, 30);
if (player->CanTameExoticPets())
{
AddGossipItemFor(player, 4, "Get a New Exotic Pet.", GOSSIP_SENDER_MAIN, 50);
}
AddGossipItemFor(player, 2, "Take me to the Stable.", GOSSIP_SENDER_MAIN, GOSSIP_OPTION_STABLEPET);
AddGossipItemFor(player, 6, "Sell me some Food for my Pet.", GOSSIP_SENDER_MAIN, GOSSIP_OPTION_VENDOR);
AddGossipItemFor(player, 5, "Close Beastmaster Window.", GOSSIP_SENDER_MAIN, 150);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case 150:
CloseGossipMenuFor(player);
break;
case 30:
AddGossipItemFor(player, 2, "<- Back to Main Menu.", GOSSIP_SENDER_MAIN, 100);
AddGossipItemFor(player, 4, "Next Page. ->", GOSSIP_SENDER_MAIN, 31);
AddGossipItemFor(player, 6, "Bat.", GOSSIP_SENDER_MAIN, 18);
AddGossipItemFor(player, 6, "Bear.", GOSSIP_SENDER_MAIN, 1);
AddGossipItemFor(player, 6, "Boar.", GOSSIP_SENDER_MAIN, 2);
AddGossipItemFor(player, 6, "Cat.", GOSSIP_SENDER_MAIN, 4);
AddGossipItemFor(player, 6, "Carrion Bird.", GOSSIP_SENDER_MAIN, 5);
AddGossipItemFor(player, 6, "Crab.", GOSSIP_SENDER_MAIN, 6);
AddGossipItemFor(player, 6, "Crocolisk.", GOSSIP_SENDER_MAIN, 7);
AddGossipItemFor(player, 6, "Dragonhawk.", GOSSIP_SENDER_MAIN, 17);
AddGossipItemFor(player, 6, "Gorilla.", GOSSIP_SENDER_MAIN, 8);
AddGossipItemFor(player, 6, "Hound.", GOSSIP_SENDER_MAIN, 9);
AddGossipItemFor(player, 6, "Hyena.", GOSSIP_SENDER_MAIN, 10);
AddGossipItemFor(player, 6, "Moth.", GOSSIP_SENDER_MAIN, 11);
AddGossipItemFor(player, 6, "Owl.", GOSSIP_SENDER_MAIN, 12);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case 31:
AddGossipItemFor(player, 2, "<- Back to Main Menu.", GOSSIP_SENDER_MAIN, 30);
AddGossipItemFor(player, 4, "<- Previous Page.", GOSSIP_SENDER_MAIN, 30);
AddGossipItemFor(player, 6, "Raptor.", GOSSIP_SENDER_MAIN, 20);
AddGossipItemFor(player, 6, "Ravager.", GOSSIP_SENDER_MAIN, 19);
AddGossipItemFor(player, 6, "Strider.", GOSSIP_SENDER_MAIN, 13);
AddGossipItemFor(player, 6, "Scorpid.", GOSSIP_SENDER_MAIN, 414);
AddGossipItemFor(player, 6, "Spider.", GOSSIP_SENDER_MAIN, 16);
AddGossipItemFor(player, 6, "Serpent.", GOSSIP_SENDER_MAIN, 21);
AddGossipItemFor(player, 6, "Turtle.", GOSSIP_SENDER_MAIN, 15);
AddGossipItemFor(player, 6, "Wasp.", GOSSIP_SENDER_MAIN, 93);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case 50:
AddGossipItemFor(player, 2, "<- Back to Main Menu.", GOSSIP_SENDER_MAIN, 100);
AddGossipItemFor(player, 2, "<- Get a New Normal Pet.", GOSSIP_SENDER_MAIN, 100);
AddGossipItemFor(player, 6, "Chimaera.", GOSSIP_SENDER_MAIN, 51);
AddGossipItemFor(player, 6, "Core Hound.", GOSSIP_SENDER_MAIN, 52);
AddGossipItemFor(player, 6, "Devilsaur.", GOSSIP_SENDER_MAIN, 53);
AddGossipItemFor(player, 6, "Rhino.", GOSSIP_SENDER_MAIN, 54);
AddGossipItemFor(player, 6, "Silithid.", GOSSIP_SENDER_MAIN, 55);
AddGossipItemFor(player, 6, "Worm.", GOSSIP_SENDER_MAIN, 56);
AddGossipItemFor(player, 6, "Loque'nahak.", GOSSIP_SENDER_MAIN, 57);
AddGossipItemFor(player, 6, "Skoll.", GOSSIP_SENDER_MAIN, 58);
AddGossipItemFor(player, 6, "Gondria.", GOSSIP_SENDER_MAIN, 59);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case GOSSIP_OPTION_STABLEPET:
player->GetSession()->SendStablePet(me->GetGUID());
break;
case GOSSIP_OPTION_VENDOR:
AddGossipItemFor(player, 2, "<- Back to Main Menu.", GOSSIP_SENDER_MAIN, 100);
AddGossipItemFor(player, 6, "Fish.", GOSSIP_SENDER_MAIN, 500);
AddGossipItemFor(player, 6, "Steak.", GOSSIP_SENDER_MAIN, 501);
AddGossipItemFor(player, 6, "Cheese.", GOSSIP_SENDER_MAIN, 502);
AddGossipItemFor(player, 6, "Fruit.", GOSSIP_SENDER_MAIN, 503);
AddGossipItemFor(player, 6, "Bread.", GOSSIP_SENDER_MAIN, 504);
AddGossipItemFor(player, 6, "Fungus.", GOSSIP_SENDER_MAIN, 505);
SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case 500:
player->AddItem(45901, 20);
CloseGossipMenuFor(player);
break;
case 501:
player->AddItem(34749, 20);
CloseGossipMenuFor(player);
break;
case 502:
player->AddItem(44607, 20);
CloseGossipMenuFor(player);
break;
case 503:
player->AddItem(43087, 20);
CloseGossipMenuFor(player);
break;
case 504:
player->AddItem(42778, 20);
CloseGossipMenuFor(player);
break;
case 505:
player->AddItem(29453, 20);
CloseGossipMenuFor(player);
break;
case 51: //chimera
CreatePet(player, me, 21879);
break;
case 52: //core hound
CreatePet(player, me, 21108);
break;
case 53: //Devilsaur
CreatePet(player, me, 20931);
break;
case 54: //rhino
CreatePet(player, me, 30445);
break;
case 55: //silithid
CreatePet(player, me, 5460);
break;
case 56: //Worm
CreatePet(player, me, 30148);
break;
case 57: //Loque'nahak
CreatePet(player, me, 32517);
break;
case 58: //Skoll
CreatePet(player, me, 35189);
break;
case 59: //Gondria
CreatePet(player, me, 33776);
break;
case 16: //Spider
CreatePet(player, me, 2349);
break;
case 17: //Dragonhawk
CreatePet(player, me, 27946);
break;
case 18: //Bat
CreatePet(player, me, 28233);
break;
case 19: //Ravager
CreatePet(player, me, 17199);
break;
case 20: //Raptor
CreatePet(player, me, 14821);
break;
case 21: //Serpent
CreatePet(player, me, 28358);
break;
case 1: //bear
CreatePet(player, me, 29319);
break;
case 2: //Boar
CreatePet(player, me, 29996);
break;
case 93: //Bug
CreatePet(player, me, 28085);
break;
case 4: //cat
CreatePet(player, me, 28097);
break;
case 5: //carrion
CreatePet(player, me, 26838);
break;
case 6: //crab
CreatePet(player, me, 24478);
break;
case 7: //crocolisk
CreatePet(player, me, 1417);
break;
case 8: //gorila
CreatePet(player, me, 28213);
break;
case 9: //hound
CreatePet(player, me, 29452);
break;
case 10: //hynea
CreatePet(player, me, 13036);
break;
case 11: //Moth
CreatePet(player, me, 27421);
break;
case 12: //owl
CreatePet(player, me, 23136);
break;
case 13: //strider
CreatePet(player, me, 22807);
break;
case 414: //scorpid
CreatePet(player, me, 9698);
break;
case 15: //turtle
CreatePet(player, me, 25482);
break;
}
return true;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new Npc_BeastmasterAI(creature);
}
};
void AddSC_Npc_Beastmaster()
{
new Npc_Beastmaster();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment