Class Trainer Plus is an addon for World of Warcraft Classic that upgrades the Class Trainer interface, adding the ability to ignore, search, and train all.
You can ignore any spell offered by your class or pet trainer by right-clicking and checking the "Ignore" option. You can then hide them from view like the other available filters. Ignoring does not work at profession trainers.
Easily find spells to ignore by using the search box. Searching also works at profession trainers.
When the Shift key is held, the Train button will allow all available, non-ignored spells to be trained at one time.
how it got a bc update. This addon is very nice :c
In reply to Sekorhex:
Version 0.9-beta now supports TBC
In reply to Aurleis:
Hello! The addon has been updated for TBC as of 0.9-beta.
I really don't know why, but the ranks are pushed off the right side of the window. Does not appear as it does in the addon image here.
EDIT: sorry, that is supposedly fixed in the beta (just d/l)
Still getting the pet training error thingy. Seems to happen when I haven't been to the pet trainer in a while. But like before, it goes away after a reload. (shrugs)
In reply to yessirreebob:
This should finally be resolved, in that you won't get an LUA error but instead will get an informational log printed to your chat window.
In reply to Nerillida:
This should finally be resolved, in that you won't get an LUA error but instead will get an informational log printed to your chat window.
FYI, there is a typo in the description: "[...] adding the abiliy to ignore, search, and train all." It should be written "ability", not "abiliy". Thanks for the addon!
In reply to Forge_User_70513360:
Thanks for letting me know!
Immediately after that I reloaded the error did not re-appear.
Got this error after I mined from lvl 89 to 91. I went straight from mining to the mining trainer and got this error. The only filters I had on were recipes ready to be trained, known & unknown were toggled off.
Date: 2019-10-27 21:10:22
ID: 1
Error occured in: Global
Count: 1
Message: ...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua line 436:
attempt to index local 'service' (a nil value)
Debug:
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:436: ClassTrainerPlus_SetSelection()
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:237:
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:223
Locals:
id = 2
showIgnored = false
serviceName = nil
serviceSubText = nil
serviceType = nil
isExpanded = nil
service = nil
(*temporary) = <table> {
visibleServices = 0
VisibleAvailableServiceIds = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:73
_byServiceId = <table> {
}
IsSelected = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:138
Update = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:131
totalServices = 0
showIgnored = false
_updateCandidates = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:14
availableCost = 0
GetFirstVisibleNonHeaderService = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:145
_byPosition = <table> {
}
GetNextAvailableServiceId = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:152
_filter = ""
GetService = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:167
GetServiceAtPosition = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:164
SetFilter = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:83
_candidates = <table> {
}
allHeadersCollapsed = true
ApplyFilter = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:88
}
(*temporary) = 2
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index local 'service' (a nil value)"
ctp = <table> {
TrainerServices = <table> {
}
L = <table> {
}
Abilities = <table> {
}
RealSpellNameMap = <table> {
}
}
CollapseTrainerSkillLine = <function> defined =[C]:-1
ExpandTrainerSkillLine = <function> defined =[C]:-1
SelectTrainerService = <function> defined =[C]:-1
GetTrainerServiceIcon = <function> defined =[C]:-1
GetTrainerServiceLevelReq = <function> defined =[C]:-1
IsTrainerServiceLearnSpell = <function> defined =[C]:-1
UnitLevel = <function> defined =[C]:-1
format = <function> defined =[C]:-1
GetTrainerServiceSkillReq = <function> defined =[C]:-1
GetTrainerServiceNumAbilityReq = <function> defined =[C]:-1
GetTrainerServiceAbilityReq = <function> defined =[C]:-1
_ = nil
GetTrainerServiceInfo = <function> defined =[C]:-1
GetTrainerServiceCost = <function> defined =[C]:-1
GetMoney = <function> defined =[C]:-1
SetMoneyFrameColor = <function> defined @Interface\FrameXML\MoneyFrame.lua:525
MoneyFrame_Update = <function> defined @Interface\FrameXML\MoneyFrame.lua:306
GetNumPrimaryProfessions = <function> defined =[C]:-1
GetTrainerServiceDescription = <function> defined =[C]:-1
StaticPopup_Visible = <function> defined @Interface\FrameXML\StaticPopup.lua:5061
StaticPopup_Hide = <function> defined @Interface\FrameXML\StaticPopup.lua:4739
In reply to yessirreebob:
Thanks for the multiple reports and info about what was happening around the errors, it will hopefully help with chasing down this strange bug!
Got this error after opening to check if I got any new BS recipes:
Date: 2019-10-20 02:16:24
ID: 1
Error occured in: Global
Count: 1
Message: ...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua line 436:
attempt to index local 'service' (a nil value)
Debug:
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:436: ClassTrainerPlus_SetSelection()
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:237:
...terface\AddOns\ClassTrainerPlus\ClassTrainerPlus.lua:223
Locals:
id = 2
showIgnored = true
serviceName = nil
serviceSubText = nil
serviceType = nil
isExpanded = nil
service = nil
(*temporary) = <table> {
visibleServices = 0
VisibleAvailableServiceIds = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:73
_byServiceId = <table> {
}
IsSelected = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:138
Update = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:131
totalServices = 0
showIgnored = true
_updateCandidates = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:14
availableCost = 0
GetFirstVisibleNonHeaderService = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:145
_byPosition = <table> {
}
GetNextAvailableServiceId = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:152
_filter = ""
GetService = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:167
GetServiceAtPosition = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:164
SetFilter = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:83
_candidates = <table> {
}
allHeadersCollapsed = true
ApplyFilter = <function> defined @Interface\AddOns\ClassTrainerPlus\TrainerServices.lua:88
}
(*temporary) = 2
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index local 'service' (a nil value)"
ctp = <table> {
TrainerServices = <table> {
}
L = <table> {
}
Abilities = <table> {
}
RealSpellNameMap = <table> {
}
}
CollapseTrainerSkillLine = <function> defined =[C]:-1
ExpandTrainerSkillLine = <function> defined =[C]:-1
SelectTrainerService = <function> defined =[C]:-1
GetTrainerServiceIcon = <function> defined =[C]:-1
GetTrainerServiceLevelReq = <function> defined =[C]:-1
IsTrainerServiceLearnSpell = <function> defined =[C]:-1
UnitLevel = <function> defined =[C]:-1
format = <function> defined =[C]:-1
GetTrainerServiceSkillReq = <function> defined =[C]:-1
GetTrainerServiceNumAbilityReq = <function> defined =[C]:-1
GetTrainerServiceAbilityReq = <function> defined =[C]:-1
_ = nil
GetTrainerServiceInfo = <function> defined =[C]:-1
GetTrainerServiceCost = <function> defined =[C]:-1
GetMoney = <function> defined =[C]:-1
SetMoneyFrameColor = <function> defined @Interface\FrameXML\MoneyFrame.lua:525
MoneyFrame_Update = <function> defined @Interface\FrameXML\MoneyFrame.lua:306
GetNumPrimaryProfessions = <function> defined =[C]:-1
GetTrainerServiceDescription = <function> defined =[C]:-1
StaticPopup_Visible = <function> defined @Interface\FrameXML\StaticPopup.lua:5061
StaticPopup_Hide = <function> defined @Interface\FrameXML\StaticPopup.lua:4739
In reply to yessirreebob:
Did you have any other windows open at the time, or was it just the trainer window?
In reply to Fusionpit:
I closed the BS window after some crafting and I wondered whether any more recipes to train had appeared. Then I clicked on the BS trainer so it was the only window open at the time.
In reply to yessirreebob:
Which filters did you have applied for the trainer? "Available", "Unavailable", "Already Known"? Did you have any text in the "Search" box?
In reply to Fusionpit:
Don't recall exactly except that I always have <Already Known> always on ... I believe I had <Unavailable> on as well.
Maybe it is better to an a "Confirmation Dialog" when use the "Train All" Function?