Thread Tools Display Modes
07-15-13, 08:58 AM   #1
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
damage meter issue related to Pet OwnerName and OwnerID

Hi Everyone !

I'm working on porting an old addon back from Cata. so far everything works fine except (it seems) Pet. (it's a kind of DPS meter)

The way used in there to get the ownername,ownerID and petID is a bit scriptic for me (i'm not a huge LUA expert, i'm just digging info and fixing with the resources i find)

Basically the issue is that (it seems) each time a hunter uses stampede, or any other classes that seem to have some weird pets, the addon floods me with errors :

Code:
Message: Interface\AddOns\dMeter\Core.lua:411: bad argument #1 to 'band' (number expected, got string)
Time: 07/14/13 14:37:15
Count: 4
Stack: [C]: ?
[C]: in function `band'
Interface\AddOns\dMeter\Core.lua:411: in function <Interface\AddOns\dMeter\Core.lua:409>
Interface\AddOns\dMeter\Core.lua:435: in function <Interface\AddOns\dMeter\Core.lua:424>
Interface\AddOns\dMeter\Core.lua:2734: in function <Interface\AddOns\dMeter\Core.lua:2636>
Interface\AddOns\dMeter\Core.lua:3193: in function <Interface\AddOns\dMeter\Core.lua:3191>

Locals:
Below is the part of code that it is complaining about

Code:
	local function _RelevantMember(flag)

		if bit.band(flag, 0x0000FC00) == 0x00000400 then
			if bit.band(flag, 0x0000000F) == 0x00000001 or  bit.band(flag, 0x0000000F) == 0x00000002 or bit.band(flag, 0x0000000F) == 0x00000004 then
				return true
			end
		end

	end

	local function _GetOwner(petid)

		if C_Pets[petid] then
			return C_Pets[petid]["OwnerID"], C_Pets[petid]["OwnerName"]
		end

		return nil
	end

	local function _CheckForOwner(petid)

		if GetNumGroupMembers() > 0 then
			for i = 1, GetNumGroupMembers() do
				if UnitGUID("raidpet"..i.."") == petid then
					return UnitGUID("raid"..i..""), UnitName("raid"..i.."")
				end
			end
		elseif GetNumGroupMembers() > 0 then
			for i = 1, GetNumGroupMembers() do
				if UnitGUID("partypet"..i.."") == petid then
					return UnitGUID("party"..i..""), UnitName("party"..i.."")
				end
			end
			if UnitGUID("pet") == petid then
				return UnitGUID("player"), UnitName("player")
			end
		else
			if UnitGUID("pet") == petid then
				return UnitGUID("player"), UnitName("player")
			end
		end

		return nil

	end

	local function _AddStupidEntryOrderPetsToOwner(petid, ownerid, ownername)

		if stupidOrderPets[petid] then
			for i = 1, #stupidOrderPets[petid] do
				_AddPet(ownerid,ownername,stupidOrderPets[petid][i])
			end
			stupidOrderPets[petid] = nil
		end

	end 

	local function _AddStupidEntryOrderPet(source, target)

		if not stupidOrderPets[source] then
			stupidOrderPets[source] = {target}
		else
			table.insert(stupidOrderPets, target)
		end

	end

	local function _RelevantPet(flag, guid)

		if (bit.band(flag,0x0000FC00) == 0x00000800 and bit.band(flag,0x000000F0) == 0x00000020) or bit.band(flag,0x0000FC00) == 0x00001000 or bit.band(flag,0x0000FC00) == 0x00002000 or bit.band(guid,0x00F0000000000000) == 0x0040000000000000 then
			local owner, ownername = _CheckForOwner(guid)
			if not owner then
				owner, ownername = _GetOwner(guid)
				return owner, ownername
			else
				return owner, ownername
			end
		end

	end

	local function _RelevantMob(flag, guid, name)

		if not guid then
			return false
		end

		if name == "The Skyfire" then
			return true
		end

		if bit.band(flag,0x000000F0) == 0x00000040 or bit.band(flag,0x000000F0) == 0x00000020 then
			local owner = _RelevantPet(flag, guid)
			if not owner then
				return true
			end

		end

		return false

	end
Any idea or help for fixing would be very appreciated as i'm totally facing a wall on that part currently. i've been doing some digging on the web, wowiki api sites etc etc.. i could find that all these bit.band are searching for the HEX values that seem to be attributed to an npc,a player,enemi etc etc.. so my "guess" is that some IDs or the way they are reported have changed and its not just giving a number like it is expecting but a string....

Many thanks for your time and help!

BuG
  Reply With Quote
07-15-13, 11:16 AM   #2
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
The problem is likely caused by the order of the arguments for COMBAT_LOG_EVENT_UNFILTERED being changed.

The error is from the variable 'flag' being a string instead of a number, which probably means it's holding the unit's name or something instead of its flags.

Can you show us what the variables are being assigned to for the COMBAT_LOG_EVENT_UNFILTERED event?

Although the fact that you say everything else is working fine would seem to indicate that it's something else..

Last edited by semlar : 07-15-13 at 11:19 AM.
  Reply With Quote
07-15-13, 12:48 PM   #3
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
Hi and thank you for your answer.

sorry for such a nebbish question but, what/where exactly should i find what you would like to see ? i do register the combat log unfiltered in the add-on, but i'm not familiar with such thing. is that printed somewhere in the cache/variables ?

i tried a suggestion from someone to print what it is showing :

Code:
local function _RelevantMember(flag)
	if type(flag) == 'string' then print("flag returned a string:", flag); return; end
but that was just a bad idea and more or less crashed everything (there are too many lua errors etc etc)

Although, here is a more complete error that happens (just realized the original one was missing a few lines)

Code:
Core.lua:411: bad argument #1 to "band" (number expected, got string)
<in C code>
dMeter-3.6\Core.lua:411: in function <dMeter\Core.lua:409>
dMeter-3.6\Core.lua:2776: in function <dMeter\Core.lua:2636>
dMeter-3.6\Core.lua:3193: in function <dMeter\Core.lua:3191>

Locals:
flag = -2147483648
guid = ""
bit = <table> {
 band = <func> =[C]:-1
 mod = <func> =[C]:-1
 rshift = <func> =[C]:-1
 arshift = <func> =[C]:-1
 bor = <func> =[C]:-1
 bnot = <func> =[C]:-1
 lshift = <func> =[C]:-1
 bxor = <func> =[C]:-1
}
_CheckForOwner = <func> @dMeter\Core.lua:361
_GetOwner = <func> @dMeter\Core.lua:352
and yeah maybe it is somewhere else but it's always pointing to the same place all the time, and it "seem" to happen when units with pets are around. but sometime, i'll be spamming spells around for 10mins without any errors popping and another moment, after 5sec of being in combat it appears…


Edit 2 : the easiest way i found to reproduce it is have a lock with me and wait for him to have a "proc Imp" this brings the error right away and will keep spamming it every few seconds.

Now i'm "convinced" more and more that it has to do with Guardians and not pet (since pet seem to be coded "okish") as guardians do not have names or id or something the add-on just get lost

Last edited by zbugrkx : 07-15-13 at 01:12 PM.
  Reply With Quote
07-15-13, 01:52 PM   #4
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
Okay, even though that function is where the error is being thrown, it isn't the source of the problem.

The problem is being caused by the fact that the function is being fed a string instead of the flags it's expecting.

The stack trace shows you the line numbers of the function calls leading up to the error. Even though line 411 is the one that it's actually failing on, that function is being called from another line (2776 in your last post).

The function _RelevantMember is being called with something other than the flags. You need to identify what it's being called with. Find where _RelevantMember is being called, look at what the variable it's being called with is named, then go back through the script until you find where that variable is assigned. That is the source of the problem.

If you can't do that, post the entire script somewhere.
  Reply With Quote
07-15-13, 02:05 PM   #5
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
Hi Semiar,

this is very useful and your help is very appreciated.

RelevantMember is called (as you said) further down the script in the following function :

Code:
local function _LogParser(timeStamp, subEvent, hideCaster, sourceGUID, sourceName, sourceFlag, sourceRaidFlag, targetGUID, targetName, targetFlag, targetRaidFlag, …)

local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12 = …
arg4, if i'm correct relates to the sourceGUID. which, if i'm correct guardians do not have and would correlate to the behavior that i'm seeing :

as soon as a Lock gets his Imp procs the error pops.

for example the part around line 2776 :

Code:
if _RelevantMember(sourceFlag) then
					if sourceGUID ~= targetGUID then			
						if _RelevantMember(targetFlag) then						
							if sourceName then						
								_CheckEntity("Damage", "Friendly", sourceGUID, sourceName)
								_AddEntry("Damage", "Friendly", nil, "Player", subEvent, sourceGUID, targetName, arg1, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)
							end
							_CheckEntity("Death", nil, targetGUID, targetName)
							_AddEntry("Death", "Damage", nil, "Player", subEvent, targetGUID, sourceName, arg1, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)
							_CheckEntity("Damage", "Taken", targetGUID, targetName)
							_AddEntry("Damage", "Taken", nil, "Player", subEvent, targetGUID, sourceName, arg1, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)
							return
						elseif subEvent ~= "DAMAGE_SPLIT" then
							_CheckEntity("Damage", "Done", sourceGUID, sourceName)							
							_AddEntry("Damage", "Done", nil, "Player", subEvent, sourceGUID, targetName, arg1, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)
							return
						end
					end
				end
  Reply With Quote
07-15-13, 02:28 PM   #6
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
Originally Posted by zbugrkx View Post
arg4, if i'm correct relates to the sourceGUID
sourceGUID is already defined, arg4 is referring to the fourth argument after "targetRaidFlag" in the parameters that the CLEU event contains. What arg4 happens to be depends on the subEvent.

The error isn't being caused by an incorrect value for flag, it's being caused by this little line inside of _RelevantPet..
Lua Code:
  1. or bit.band(guid,0x00F0000000000000) == 0x0040000000000000

edit: It's expecting guid to be a number, not a string. I don't know if this was changed at some point, but it's certainly not a number today.

Try changing it to or tonumber(strsub(guid or '00000', 5, 5) or 0, 16) % 8 == 4 which is basically pulling the fifth character out of the guid (which identifies the unit type) and checks if it's 4 (which identifies it as a pet).

Last edited by semlar : 07-15-13 at 02:40 PM.
  Reply With Quote
07-15-13, 02:37 PM   #7
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
I was actually wondering exactly what is this part of code doing exactly, i could find the correspondences of all the HEX part on the web like

http://wowdiff.googlecode.com/svn-hi.../Constants.lua

but the last bit you mentioned, i couldn't find it anywhere… do you know what this is doing ?

i'm gonna try first to see what happens when i set it to FLAG instead of GUID and see if anything happens..
  Reply With Quote
07-15-13, 02:41 PM   #8
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
Check my edit, I realized what it's supposed to be doing after I wrote it.
  Reply With Quote
07-15-13, 02:44 PM   #9
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
yep just checked it and understand.. however that code you gave gives an error :

Code:
Core.lua:429: attempt to call global "strsub" (a nil value)

it doesn't seem to like that
  Reply With Quote
07-15-13, 02:51 PM   #10
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
strsub is a valid function implemented in the client. It shouldn't be throwing an error in-game. It's not a native lua function so it might cause problems if you're trying to run it outside of the game.

Just change it to string.sub.
  Reply With Quote
07-15-13, 02:59 PM   #11
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
yeah, i have that strsub in other add ons just ok..and i use that in game.. no idea but str.sub works ok.. i'm gonna try and see what happens… thanks so much for your help so far !


Edit :

doh ! almost.. (error popped up when hunter used stampede)

Code:
8x dMeter-3.6\Core.lua:429: attempt to perform arithmetic on a nil value
dMeter-3.6\Core.lua:429: in function <dMeter\Core.lua:427>
dMeter-3.6\Core.lua:453: in function <dMeter\Core.lua:442>
dMeter-3.6\Core.lua:2702: in function <dMeter\Core.lua:2654>
dMeter-3.6\Core.lua:3211: in function <dMeter\Core.lua:3209>

Locals:
flag = 2632
guid = ""
name = nil
bit = <table> {
 band = <func> =[C]:-1
 mod = <func> =[C]:-1
 rshift = <func> =[C]:-1
 arshift = <func> =[C]:-1
 bor = <func> =[C]:-1
 bnot = <func> =[C]:-1
 lshift = <func> =[C]:-1
 bxor = <func> =[C]:-1
}
_RelevantPet = <func> @dMeter\Core.lua:427
but from my few readings, i think guardians actually don't have a proper ID or at least they don't have a name (saw that in TinyDPS for example :

Code:
if not arg9 then
    arg9 = NONE
  end
that could explain why it has a "nil value" ?

Last edited by zbugrkx : 07-15-13 at 03:04 PM.
  Reply With Quote
07-15-13, 03:16 PM   #12
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
You need to add something like if not guid or guid == '' then return end to the top of the _RelevantPet function to just exit if there's no guid.

The error is being caused by the guid being an empty string which is one of the only things I didn't make an exception for in my example.

Actually, hang on I'll write something better because that will make it lose some of its functionality.

Last edited by semlar : 07-15-13 at 03:22 PM.
  Reply With Quote
07-15-13, 03:23 PM   #13
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
Originally Posted by semlar View Post
You need to add something like if not guid or guid == '' then return end to the top of the _RelevantPet function to just exit if there's no guid.

The error is being caused by the guid being an empty string which is one of the only things I didn't make an exception for in my example.

Actually, hang on I'll write something better because that will make it lose some of its functionality.
wouldn't it cause the function to not work at all if we completely exit when there is no GUID ?

wouldn't setting something like NONE (as the example above) shown would work better ?
  Reply With Quote
07-15-13, 03:30 PM   #14
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
Try changing the if statement to this..
Lua Code:
  1. if (bit.band(flag,0x0000FC00) == 0x00000800 and bit.band(flag,0x000000F0) == 0x00000020) or bit.band(flag,0x0000FC00) == 0x00001000 or bit.band(flag,0x0000FC00) == 0x00002000 or (guid and guid:len() >= 5 and tonumber(guid:sub(5,5), 16) % 8 == 4) then

A unit can not have a name, but it should never be missing a GUID. If the GUID field is missing, there's no way to track the unit. In other words even if there were a unit without a GUID, it wouldn't be possible to identify who it belonged to.

I know for a fact stampeded pets all have GUIDs and even guardians summoned by trinkets such as voodoo gnomes do as well.

Last edited by semlar : 07-15-13 at 03:45 PM.
  Reply With Quote
07-15-13, 04:05 PM   #15
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
Originally Posted by semlar View Post
Try changing the if statement to this..
Lua Code:
  1. if (bit.band(flag,0x0000FC00) == 0x00000800 and bit.band(flag,0x000000F0) == 0x00000020) or bit.band(flag,0x0000FC00) == 0x00001000 or bit.band(flag,0x0000FC00) == 0x00002000 or (guid and guid:len() >= 5 and tonumber(guid:sub(5,5), 16) % 8 == 4) then

A unit can not have a name, but it should never be missing a GUID. If the GUID field is missing, there's no way to track the unit. In other words even if there were a unit without a GUID, it wouldn't be possible to identify who it belonged to.

I know for a fact stampeded pets all have GUIDs and even guardians summoned by trinkets such as voodoo gnomes do as well.
Ok, good to know, not sure exactly what i did read before (i guess i'm confused between name/guid etc)

so far, with your latest tweak, it seem to be fully working, and dos tracked by hunter + lock is accurate (compared to skada/recount) i'll give it further try, but thank you so much for your work and your help, i would have never figured that out!
  Reply With Quote
07-17-13, 01:16 AM   #16
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
i'll continue testing but so far that issue seem to be solved! thanks again!
  Reply With Quote
07-18-13, 02:57 PM   #17
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
Hi Semlar.

So far so good, the add-on works errorless.. however it is not recording all pet/guardians damage all the time. it will randomly record or not. resulting in totally off values.

i wonder if you might have an idea ?

thanks

cheers

BuG
  Reply With Quote
07-18-13, 04:16 PM   #18
semlar
A Pyroguard Emberseer
 
semlar's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2007
Posts: 1,060
Is there anything that the missing pets have in common?
  Reply With Quote
07-19-13, 01:05 PM   #19
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
i'm investigating deeper, been doing billions of dog and lfr etc. running both recount/skada + the add-on all in parallel. damages are spot on up to the last digit.

i think the issue is coming from the default updating time of 5sec for the data. using 1sec (which is what recount/skada are using) makes it work fine.

i guess the delay is way too big for the amount of data and creates gab + sometimes will just lose some stuff if you are not actively fighting and just let a pet do things. (i.e. : cast a dot on dummy and nothing else, it won't show anything in the add-on since you get out of combat before the 5sec starts)

Either the way it was "storing" the data before needs some update or there is maybe a way to make it "buffer" somehow but well that's way out of my knowledge...if 1sec isn't make memory usage + cpu go nuts, i guess it should be fine. feel free if you have an idea tho ^^


thanks for following up with me, very appreciated! i'll keep you up to date.
  Reply With Quote
07-20-13, 11:05 AM   #20
zbugrkx
A Fallenroot Satyr
Join Date: Jul 2013
Posts: 25
If the caster is not in combat, it stops recording. for example, i died on on Sha and it will stop recording anything.

couldn't figure where this is.
  Reply With Quote

WoWInterface » Developer Discussions » General Authoring Discussion » damage meter issue related to Pet OwnerName and OwnerID

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off