Jump to content

Global Lua API


Ordush

Recommended Posts

Hey yall
Anyone knows if there is a link to the global lua api for any wow versions?

A document where all the global functions are in.
i.e.
The game has the function UnitRace() or the function IsSpellKnown
Reason i want to find this is because i want to add some of these functions added to the gamer after 2.4.3 into my fight class.
I have already added some of those that i could figure out how were made like: print, UnitBuffName, cdRemains, IsSpellUsable etc.
But i can not for the life of me guess what the code is for IsSpellKnown. I need to have this function in order to be able to use spell id's instead of spell names (thereby making it possible to make my fightclass multi-language supported).
Does the WRobot api have a way to determine spell by ID instead of name? Would be easy if i only needed to be level 70 spells. But if i want to make it available for leveling, i'd need a way to check if a spell is known.
Example:
public Spell SerpentSting = new Spell("Serpent Sting");
If i wanted to add this as a spell ID then i could do this in Lua:
SerpentSting = "false"
if SpellIsKnown(27016) then -- Rank 10
  SerpentSting = 27016
elseif SpellIsKnown(25295) then -- Rank 9
  SerpentSting = 25295
end
if not SerpentSting == "false" then
   CastSpellByName (GetSpellInfo(SerpentSting)
end
With this i can define spellname id based on what rank you have available. :)

Link to comment
Share on other sites

IsSpellKnown is super easy.
Just call GetSpellInfo("spellName")
It will only give you shit from your spell book.

Or here's my vanilla implementation:

public bool IsKnown()
{
  //not a great runtime solution, but spellbook should get updated on newly learned spells
  //this SHOULD check if we have the rank available
  string luaString = @"
    local i = 1
    while true do
    local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL);
  if not spellName then
    break;
  end

    -- use spellName and spellRank here
    if(spellName == ""{0}"" and spellRank == ""Rank {1}"") then
    --DEFAULT_CHAT_FRAME:AddMessage( spellName .. '(' .. spellRank .. ')' );
  return true;
  end

    i = i + 1;
  end
    return false;";
      return Lua.LuaDoString<bool>(string.Format(luaString, Name, GetRank()));
}

 

Link to comment
Share on other sites

14 minutes ago, Matenia said:

IsSpellKnown is super easy.
Just call GetSpellInfo("spellName")
It will only give you shit from your spell book.

Or here's my vanilla implementation:


public bool IsKnown()
{
  //not a great runtime solution, but spellbook should get updated on newly learned spells
  //this SHOULD check if we have the rank available
  string luaString = @"
    local i = 1
    while true do
    local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL);
  if not spellName then
    break;
  end

    -- use spellName and spellRank here
    if(spellName == ""{0}"" and spellRank == ""Rank {1}"") then
    --DEFAULT_CHAT_FRAME:AddMessage( spellName .. '(' .. spellRank .. ')' );
  return true;
  end

    i = i + 1;
  end
    return false;";
      return Lua.LuaDoString<bool>(string.Format(luaString, Name, GetRank()));
}

 

Yeah, but the problem is that you can do GetSpellInfo and get the info on a spell even if you don't know the spell.

Edited by Ordush
Link to comment
Share on other sites

7 minutes ago, Matenia said:

Not in TBC it doesn't. If you use the name, NOT THE ID, then it will ONLY return info if you have it in your spell book. I've been using this for months...

Yeah, and that takes me nowhere, when i want to make my fightclase multi-language. :)
My point was exactly that i wanted to use ID instead of name, so that example french players don't have to use English client. :)
try and check id 1234, just an example. :)

But thank you for the tip mate! :)

Edited by Ordush
Link to comment
Share on other sites

6 minutes ago, Ordush said:

Yeah, and that takes me nowhere, when i want to make my fightclase multi-language. :)
My point was exactly that i wanted to use ID instead of name, so that example french players don't have to use English client. :)
try and check id 1234, just an example. :)

But thank you for the tip mate! :)

So basically:

return GetSpellInfo(GetSpelInfo(1234)) ~= nil;

get name by id, then use name to check if it's in spell book...

Link to comment
Share on other sites

4 minutes ago, Matenia said:

So basically:


return GetSpellInfo(GetSpelInfo(1234)) ~= nil;

get name by id, then use name to check if it's in spell book...

LOL Doh... Why did i not think of that?
Thank you mate! much appreciated! <3

Link to comment
Share on other sites

@Matenia

I figured why this method doesn't work well.
It sure does work cross language, but you won't be able to rank check with this.
If you have rank 1 of an ability, it will never do nil no matter what ID you use, be it rank 1 or rank 5 of a spell.
Reason this has a consequence: Say i want it to buy mats for buffs. Then i won't be able to specify what mats to buy based on what rank is available.

I could go the long way and check what rank the player has as max (which this will always post if it's not nil). Then set to nil if the known rank (google) for a spell does not mach the rank of the players spell.
However, it would be a lot easier if i had the wow api function from wotlk+.
So if anyone knows a way to get the functions from the wow api. (the whole code) please let me know. :)

Link to comment
Share on other sites

5 minutes ago, Icesythe7 said:

So you are wanting to input a spell id and return the max rank of that spell if it isknown or nil if it is not known...am i understanding correctly?

I want to input spell id, then i want it to return true if the player has that spell and nil if the player doesn't.
If you do GetSpellInfo("AnyID") it will always just post the info in that table no matter if you know the spell or not.
If you do GetSpellInfo(GetSpellInfo("AnyID")) then IF you know the spell (no matter what rank you have) it will post the table for the highest rank of the spell that spell in your spellbook. (Because you basicly search for name instead of ID).
What is to check SpellID if player has that spell WITH the rank that follows with the ID then return true
else return nil, even if it has the Spell but in a lower rank.
Hope it makes sense. :)

So in short, not the max rank the player has, that's easy just do GetSpellInfo(GetSpellInfo("AnyID"))
I want to check for the rank that comes with the ID.

Edited by Ordush
Link to comment
Share on other sites

Just now, Icesythe7 said:

So you simply want a function like this 


            if (HasSpell(56342))
            {
                //dosomething
            

 

Here is EXACTLY what i want to do using my old PQR shadow priest (WOTLK) example. :)

-- Prayer of Fortitude
local POFortitude = false
local POFMat = false
-- Rank 4
if IsSpellKnown(48162) then
	POFortitude = 48162
	POFMat = "DevoutCandles"
-- Rank 3
elseif IsSpellKnown(25392) then
	POFortitude = 25392
	POFMat = "SacredCandles"
-- Rank 2
elseif IsSpellKnown(21564) then
	POFortitude = 21564
	POFMat = "SacredCandles"
-- Rank 1
elseif IsSpellKnown(21562) then
	POFortitude = 21562
	POFMat = "HolyCandles"
end

So i want to check if the player has a spell in a certain rank by ID
As you can see here: If the player doesn't have Prayer of Fortitude at all, it will make POFortitude false
If the player does have Prayer of Fortitude rank 2 it will make POFortitude that rank
Then later when i tell it to cast spell by ID (I cast by ID to make it multi-lang). It will check the bag if it has mat based on POFMat >5 (So it only casts prayer if it has more than 5 mats).
 

Link to comment
Share on other sites

9 minutes ago, Ordush said:

Here is EXACTLY what i want to do using my old PQR shadow priest (WOTLK) example. :)


-- Prayer of Fortitude
local POFortitude = false
local POFMat = false
-- Rank 4
if IsSpellKnown(48162) then
	POFortitude = 48162
	POFMat = "DevoutCandles"
-- Rank 3
elseif IsSpellKnown(25392) then
	POFortitude = 25392
	POFMat = "SacredCandles"
-- Rank 2
elseif IsSpellKnown(21564) then
	POFortitude = 21564
	POFMat = "SacredCandles"
-- Rank 1
elseif IsSpellKnown(21562) then
	POFortitude = 21562
	POFMat = "HolyCandles"
end

So i want to check if the player has a spell in a certain rank by ID
As you can see here: If the player doesn't have Prayer of Fortitude at all, it will make POFortitude false
If the player does have Prayer of Fortitude rank 2 it will make POFortitude that rank
Then later when i tell it to cast spell by ID (I cast by ID to make it multi-lang). It will check the bag if it has mat based on POFMat >5 (So it only casts prayer if it has more than 5 mats).
 

        public bool HasSpellId(int spellId)
        {
            return SpellManager.SpellBook().Any(spell => spell.Id == spellId);
        }

The smart way to do this is make an array of the shit u wanna check and checkit onload and whatever is to add it to a new array and use that new array for what u need to do to minimize the loop thi does, then register an lua event ontrained spell(w/e the name is) and anytime it called update ur local array 

Link to comment
Share on other sites

1 minute ago, Icesythe7 said:

        public bool HasSpellId(int spellId)
        {
            return SpellManager.SpellBook().Any(spell => spell.Id == spellId);
        }

 

Awesome mate, so it checks the spellbook if it has a spell with given spellid.
But this is in C#. Is there any way to do this in Lua? (My druid is not made in CS): =/
I know it can be done in Lua, because blizzard themselves implemented it in WOTLK with the IsSpellKnown Function Which is the one i'm trying to get. :)

Link to comment
Share on other sites

1 minute ago, Ordush said:

Awesome mate, so it checks the spellbook if it has a spell with given spellid.
But this is in C#. Is there any way to do this in Lua? (My druid is not made in CS): =/
I know it can be done in Lua, because blizzard themselves implemented it in WOTLK with the IsSpellKnown Function Which is the one i'm trying to get. :)

Oh didnt know u needed it in lua um let me lookup the api on that if i can do it in vanilla i can do it in tbc im sure

Link to comment
Share on other sites

5 minutes ago, Icesythe7 said:

would it help u any if i could return the name and rank of only known spells?

Hehe, that's what i wrote above.
Also easy
local name, rank = GetSpellInfo("spellID")
The thing is, i'm a pretty advanced Lua programmer, but the IsSpellKnown is function is what is tricking me.
I could make it myself and manually add every spellid, then compare the given rank by ID with rank from GetSpellInfo.
This will take ages, which is why i'm trying to find out how Blizz did it. :)

Link to comment
Share on other sites

54 minutes ago, Icesythe7 said:

What are u doing by the way executing an entire lua script in c# in a loop?

Well, not exactly. :)
Some of it is looped, if it needs to be.
Where others aren't. :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...