I am getting an lua error whenever I click on any humanoid battle pet. (For example, Curious Wolvar Pup).
Message: Interface/FrameXML/TargetFrame.lua:373: attempt to concatenate field '?' (a nil value)
Time: Sat Nov 11 09:27:28 2023
Count: 3
Stack: Interface/FrameXML/TargetFrame.lua:373: attempt to concatenate field '?' (a nil value)
[string "@Interface/FrameXML/TargetFrame.lua"]:373: in function `CheckBattlePet'
[string "@Interface/FrameXML/TargetFrame.lua"]:154: in function `Update'
[string "@Interface/FrameXML/TargetFrame.lua"]:169: in function `OnEvent'
[string "@Interface/FrameXML/UnitFrame.lua"]:1086: in function <Interface/FrameXML/UnitFrame.lua:1084>
[string "=[C]"]: in function `CameraOrSelectOrMoveStop'
[string "CAMERAORSELECTORMOVE"]:4: in function <[string "CAMERAORSELECTORMOVE"]:1>
Locals: self = TargetFrame {
0 = <userdata>
CreateSpellbar = <function> defined @Interface/FrameXML/TargetFrame.lua:984
GetSnapOffsets = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:609
systemInfo = <table> {
}
IsFrameAnchoredToMe = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:694
TrySetCompositeNumberSettingValue = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:212
downKeys = <table> {
}
CheckDead = <function> defined @Interface/FrameXML/TargetFrame.lua:468
GetSelectionOffset = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:540
ResetToDefaultPosition = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:254
GetScaledSelectionSides = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:532
overHealAbsorbGlow = Texture {
}
SelectSystem = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:763
GetFrameMagneticEligibility = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:714
healAbsorbBar = Texture {
}
UpdateSystemSettingUseLargerFrame = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:1224
Update = <function> defined @Interface/FrameXML/TargetFrame.lua:126
unit = "target"
IsBelowFrame = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:499
SetScaleBase = <function> defined =[C]:-1
HasActiveChanges = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:381
GetScaledCenter = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:525
IsToTheRightOfFrame = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:487
OnLoad = <function> defined @Interface/FrameXML/TargetFrame.lua:32
UpdateDisplayInfoOptions = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:456
unitHPPercent = 1
GetSystemName = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:822
ProcessMovementKey = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:39
GetSettingValueBool = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:436
HasCompositeNumberSetting = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:385
otherHealPredictionBar = Texture {
}
UpdateRaidTargetIcon = <function> defined @Interface/FrameXML/TargetFrame.lua:955
GetTargetPingGUID = <function> defined @Interface/SharedXML/PingableType.lua:21
DoesSettingValueEqual = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:440
portrait = Texture {
}
UpdateSelectionVerticalState = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:1339
healAbsorbBarLeftShadow = Texture {
}
IsToTheLeftOfFrame = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:481
GetSettingsDialogAnchor = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:465
hasActiveChanges = false
OnSystemLoad = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:3
ClearFrameSnap = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:653
GetCombinedCenterOffset = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:596
SetupSettingsDialogAnchor = <function> defined @Interface/FrameXML/EditModeSystemTemplates.lua:1199
o
From reading the code, it looks like there’s an off by one error when converting the battle pet unit type to a suffix string.
local petType = UnitBattlePetType(self.unit);
self.TargetFrameContent.TargetFrameContentContextual.PetBattleIcon:SetTexture(Interface\\TargetingFrame\\PetBadge-..PET_TYPE_SUFFIX[petType]);
PET_TYPE_SUFFIX = {
[1] = "Humanoid",
[2] = "Dragon",
[3] = "Flying",
[4] = "Undead",
[5] = "Critter",
[6] = "Magical",
[7] = "Elemental",
[8] = "Beast",
[9] = "Water",
[10] = "Mechanical",
};
I tested this using a macro and confirmed that the return value of UnitBattlePetType for humanoid battle pets is 0, when the lua expects it to be 1.