2016-02-14 15:20:05 +01:00
local Beastmaster = {
entry = 823 , -- Beastmaster entry.
maxObj = 13 , -- 13 = Max amt. of menu objects.
}
function Beastmaster . OnHello ( event , player , unit )
-- Check whether the player is actually a hunter or not.
if ( player : GetClass ( ) == 3 ) then
-- Check if player is able to tame pets.
if ( player : HasSpell ( 1515 ) ) then
Beastmaster.GenerateMenu ( 1 , player , unit ) ;
else
player : SendBroadcastMessage ( " [Eluna Beastmaster]: You are not able to tame pets. " )
end
else
player : SendBroadcastMessage ( " [Eluna Beastmaster]: Only Hunters can use this service! " )
end
end
function Beastmaster . OnSelect ( event , player , unit , sender , intid , code )
-- Intid 0 is used solely for menu pages and 1 for pet selection.
if ( intid == 0 ) then
Beastmaster.GenerateMenu ( sender , player , unit ) ;
elseif ( intid == 1 ) then
-- Spawn a temporary, friendly version of the selected creature and force tame it.
local pet = PerformIngameSpawn ( 1 , sender , unit : GetMapId ( ) , unit : GetInstanceId ( ) , unit : GetX ( ) , unit : GetY ( ) , unit : GetZ ( ) , unit : GetO ( ) , false , 5000 )
pet : SetFaction ( 35 )
player : CastSpell ( pet , 2650 , true )
player : GossipComplete ( )
end
end
function Beastmaster . GenerateMenu ( id , player , unit )
local low = ( ( Beastmaster.maxObj * id ) - Beastmaster.maxObj + 1 )
local high = Beastmaster.maxObj * id
-- Retrieve the current page sets' gossip option information.
for i = low , high do
local t = Beastmaster [ " Cache " ] [ i ]
2020-04-15 16:10:12 +03:00
if t then -- show "i" if only exists in the table
-- Do not list gossip options with creatures above the players level.
if ( player : GetLevel ( ) >= t [ " level " ] ) then
player : GossipMenuAddItem ( 2 , " Level: " .. t [ " level " ] .. " - " .. t [ " name " ] , t [ " entry " ] , 1 )
end
2016-02-14 15:20:05 +01:00
end
end
-- If the menu is not the first menu, show Previous button.
if ( id ~= 1 ) then
player : GossipMenuAddItem ( 4 , " <-- Previous " , id - 1 , 0 )
end
-- If the next menu has available objects and object is within player level, show Next button.
if ( Beastmaster [ " Cache " ] [ high + 1 ] ) and ( player : GetLevel ( ) >= Beastmaster [ " Cache " ] [ high + 1 ] [ " level " ] ) then
player : GossipMenuAddItem ( 4 , " Next --> " , id + 1 , 0 )
end
player : GossipSendMenu ( 1 , unit )
end
function Beastmaster . LoadCache ( )
Beastmaster [ " Cache " ] = { }
local i = 1 ;
local Query ;
if ( GetCoreName ( ) == " MaNGOS " ) then
2016-02-14 17:06:25 +01:00
Query = WorldDBQuery ( " SELECT Entry, Name, MaxLevel FROM creature_template WHERE CreatureType=1 AND CreatureTypeFlags&1 <> 0 AND Family!=0 ORDER BY MaxLevel ASC; " )
2016-02-14 15:20:05 +01:00
elseif ( GetCoreName ( ) == " TrinityCore " ) then
2016-02-14 23:36:52 +01:00
Query = WorldDBQuery ( " SELECT Entry, Name, MaxLevel FROM creature_template WHERE Type=1 AND Type_Flags&1 <> 0 AND Family!=0 ORDER BY MaxLevel ASC; " )
2016-02-14 15:20:05 +01:00
end
if ( Query ) then
repeat
Beastmaster [ " Cache " ] [ i ] = {
entry = Query : GetUInt32 ( 0 ) ,
name = Query : GetString ( 1 ) ,
level = Query : GetUInt32 ( 2 )
} ;
i = i + 1
until not Query : NextRow ( )
print ( " [Eluna Beastmaster]: Cache initialized. Loaded " .. Query : GetRowCount ( ) .. " tameable beasts. " )
else
print ( " [Eluna Beastmaster]: Cache initialized. No results found. " )
end
end
Beastmaster.LoadCache ( )
RegisterCreatureGossipEvent ( Beastmaster.entry , 1 , Beastmaster.OnHello )
RegisterCreatureGossipEvent ( Beastmaster.entry , 2 , Beastmaster.OnSelect )