mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
91 lines
3.5 KiB
Lua
91 lines
3.5 KiB
Lua
|
|
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]
|
||
|
|
|
||
|
|
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
|
||
|
|
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
|
||
|
|
Query = WorldDBQuery("SELECT Entry, Name, MaxLevel FROM creature_template WHERE CreatureType=1 AND CreatureTypeFlags&1 <> 0 AND Family!=0 ORDER BY MaxLevel ASC;")
|
||
|
|
elseif(GetCoreName() == "TrinityCore") then
|
||
|
|
Query = WorldDBQuery("SELECT Entry, Name, MaxLevel FROM creature_template WHERE Type=1 AND Type_Flags&1 <> 0 AND Family!=0 ORDER BY MaxLevel ASC;")
|
||
|
|
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)
|