DPS Parser .mac?

Have a macro idea but not sure where to start? Ask here.

Moderator: MacroQuest Developers

MyEmQueTwo
orc pawn
orc pawn
Posts: 14
Joined: Mon Jul 13, 2015 7:15 pm

DPS Parser .mac?

Post by MyEmQueTwo » Mon Jul 13, 2015 10:29 pm

Does anyone know of any DPS Parser macro's out there? I found this one but unfortunately it seems to be a little outdated. Maybe it's possible to get some help fixing it up?

Parser.inc

Code: Select all

#event Outgoing		"You slash #*# for #1# points of damage."
#event Outgoing		"You crush #*# for #1# points of damage."
#event Outgoing		"You hit #*# for #1# points of damage."
#event Outgoing		"You kick #*# for #1# points of damage."
| #event Spells  		"#*# was hit by non-melee for #1# points of damage."
#Event Incoming     "#*# hits YOU for #1#"
#Event EndParse		"<#1#> End"

Sub Main
	/call ParseSetup
	
	:Main_Loop
		/doevents
	
		
	/goto :Main_Loop
/return

Sub ParseSetup
	|- Total time for the fight
	/if (!${Defined[TotalTime]}) /declare TotalTime int outer 0
	
	|- List to be used for dealt hits
	/if (!${Defined[HitsOut]}) /declare HitsOut string outer "HitsOut"
	
	|- List to be used for dealt hits
	/if (!${Defined[HitsIn]}) /declare HitsIn string outer "HitsIn"	
	
	|- Timer to track duration
	/if (!${Defined{StartTimer]}) /declare StartTimer timer outer 0
	
	|- Are we currently parsing
	/if (!${Defined[Parsing]}) /declare Parsing bool outer FALSE	
/return

Sub Event_Outgoing(string Line, int Damage) 
	/if (!${Parsing}) {
		/varset Parsing TRUE
		/varset StartTimer 1000000
	}
	/data ${Vector[${HitsOut}].Insert[${Damage}]}
/return

Sub Event_Incoming(string Line, int Damage)
 	/if (!${Parsing}) {
		/varset Parsing TRUE
		/varset StartTimer 1000000
	}
	/data ${Vector[${HitsIn}].Insert[${Damage}]}
/return

Sub Event_EndParse(string Line, string Sender)
	/if (${Me.Name.NotEqual[${Sender}]}) /return
	/varset Parsing FALSE
	/varcalc TotalTime 1000000 - ${StartTimer}
	/varcalc TotalTime ${TotalTime} / 10
	
	/declare damageOut int local 0
	/call FindTotal "${HitsOut}"
	/varset damageOut ${Macro.Return}
	
	/guildsay >>> PARSE RESULTS <<<
	/guildsay Fight Time: ${TotalTime}
	/guildsay   ** Incoming Stats **
	/call EchoResults "${HitsIn}"
	/guildsay   ********************
	/guildsay   ** Outgoing Stats **
	/call EchoResults "${HitsOut}"
	/guildsay **********************
	/guildsay >>> END RESULTS <<<
	
	/call ResetParser
/return

Sub EchoResults(string ArrayName)
	/call FindTotal "${ArrayName}"	
	/declare damage int local ${Macro.Return}
	/call FindMinimum "${ArrayName}"
	/declare min int local ${Macro.Return}
	/call FindMaximum "${ArrayName}"
	/declare max int local ${Macro.Return}
	/call FindAverage "${ArrayName}"
	/declare avg int local ${Macro.Return}
	/call FindDPS "${ArrayName}" ${TotalTime}
	/declare dps ${Macro.Return}
	
	/guildsay Total: ${damage}
	/guildsay Minimum: ${min}
	/guildsay Maximum: ${max}
	/guildsay Average: ${avg}
	/guildsay DPS: ${dps}
/return

Sub FindMinimum(string ArrayName)
	/declare minimum int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/if (${Vector[${ArrayName}].At[${i}]} < ${minimum} || ${minimum} == 0) {
			/varset minimum ${Vector[${ArrayName}].At[${i}]}
		}
	/next i
	
/return ${minimum}

Sub FindMaximum(string ArrayName)
	/declare maximum int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/if (${Vector[${ArrayName}].At[${i}]} > ${maximum}) {
			/varset maximum ${Vector[${ArrayName}].At[${i}]}
		}
	/next i
	
/return ${maximum}

Sub FindAverage(string ArrayName)
	/declare total int local 0
	/declare average int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/varcalc total ${total} + ${Vector[${ArrayName}].At[${i}]}
	/next i
	
	/varcalc average ${total} / ${Vector[${ArrayName}].Size}
	
/return ${average}

Sub FindTotal(string ArrayName) 
	/declare total int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/varcalc total ${total} + ${Vector[${ArrayName}].At[${i}]}
	/next i
	
/return ${total}

Sub FindDPS(string ArrayName, int TotalTime)
	/declare total int local 0
	/declare DPS
	/call FindTotal ${ArrayName}
	/varset total ${Macro.Return}
	
	/varcalc DPS ${total} / ${TotalTime}
	
/return ${DPS}

Sub ResetParser
	/varset TotalTime 0
	/varset StartTimer 0
/return
Parser.mac

Code: Select all

#event Outgoing		"You slash #*# for #1# points of damage."
#event Outgoing		"You crush #*# for #1# points of damage."
#event Outgoing		"You hit #*# for #1# points of damage."
#event Outgoing		"You kick #*# for #1# points of damage."
#Event Outgoing		"kick #*# for #1#"
#Event Outgoing		"bash #*# for #1#"
#Event Outgoing		"slash #*# for #1#"
#Event Outgoing		"crush #*# for #1#"
#Event Outgoing		"pierce #*# for #1#"
#Event Outgoing		"hit #*# for #1#"
#Event Outgoing		"punch #*# for #1#"
| #event Spells  	"#*# was hit by non-melee for #1# points of damage."
#Event Incoming     "#*# YOU for #1# points of damage."
#Event EndParse		"<#1#> End"
#Event MobDied      "#*# has been slain by #*#" 
#Event MobDied      "#*#You have slain #*#" 
#Event MissIn		"#*# tries to hit YOU, but misses#*#"
#Event MissIn		"#*# tries to kick YOU, but misses#*#"
#Event MissIn		"#*# tries to slash YOU, but misses#*#"
#Event MissIn		"#*# tries to crush YOU, but misses#*#"
#Event MissIn		"#*# tries to bash YOU, but misses#*#"
#Event MissIn		"#*# tries to pierce YOU, but misses#*#"
#Event MissIn		"#*# tries to hit YOU, but YOU#*#"
#Event MissIn		"#*# tries to kick YOU, but YOU#*#"
#Event MissIn		"#*# tries to slash YOU, but YOU#*#"
#Event MissIn		"#*# tries to crush YOU, but YOU#*#"
#Event MissIn		"#*# tries to bash YOU, but YOU#*#"
#Event MissIn		"#*# tries to pierce YOU, but YOU#*#"
#Event MissOut		"missed |${Target.CleanName}|#*#"

Sub Main
	/call ParseSetup
	
	/echo Parser is starting...
	:Main_Loop
		/doevents		
	/goto :Main_Loop
/return

Sub ParseSetup
	|- Total time for the fight
	/if (!${Defined[TotalTime]}) /declare TotalTime int outer 0
	
	|- List to be used for dealt hits
	/if (!${Defined[HitsOut]}) /declare HitsOut string outer "HitsOut"
	
	|- List to be used for dealt hits
	/if (!${Defined[HitsIn]}) /declare HitsIn string outer "HitsIn"	
	
	|- List to be used for spells outgoing
	/if (!${Defined[SpellsOut]}) /declare SpellsOut string outer "SpellsOut"

	|- List to be used for spells outgoing
	/if (!${Defined[SpellsIn]}) /declare SpellsIn string outer "SpellsIn"
	
	|- Track misses
	/if (!${Defined[MissCounterIn]}) /declare MissCounterIn int outer 0
	/if (!${Defined[MissCounterOut]}) /declare MissCounterOut int outer 0
	
	|- Timer to track duration
	/if (!${Defined[StartTimer]}) /declare StartTimer timer outer 0
	
	|- Are we currently parsing
	/if (!${Defined[Parsing]}) /declare Parsing bool outer FALSE	
	
	|- Do we parse outgoing damage?
	/if (!${Defined[ParseOut]}) /declare ParseOut bool outer TRUE
	
	|- Do we parse incoming damage?
	/if (!${Defined[ParseIn]}) /declare ParseIn bool outer TRUE
/return

Sub Event_Outgoing(string Line, int Damage) 
	/if (!${Parsing}) {
		/call StartParse
	}
	
	/if (${Damage} == 32000) /return
	
	/data ${Vector[${HitsOut}].Insert[${Damage}]}
/return

Sub Event_MissIn
	/if (!${Parsing}) {
		/call StartParse
	}
	/varcalc MissCounterIn ${MissCounterIn} + 1
/return

Sub Event_MissOut
	/if (!${Parsing}) {
		/call StartParse
	}
	/varcalc MissCounterOut ${MissCounterOut} + 1
/return

Sub StartParse
	/call ResetParser
	/echo Beginning to parse...
	/varset Parsing TRUE
	/varset StartTimer 1000000
/return

Sub Event_Incoming(string Line, int Damage)
 	/if (!${Parsing}) {
		/call StartParse
	}
	/data ${Vector[${HitsIn}].Insert[${Damage}]}
/return

Sub Event_MobDied
	/call Event_EndParse "something" "${Me.CleanName}"
/return

Sub Event_EndParse(string Line, string Sender)
	/if (${Me.Name.NotEqual[${Sender}]}) /return
	/varset Parsing FALSE
	/varcalc TotalTime 1000000 - ${StartTimer}
	/varcalc TotalTime ${TotalTime} / 10
	
	/declare damageOut int local 0
	/call FindTotal "${HitsOut}"
	/varset damageOut ${Macro.Return}
	
	/guildsay >>> PARSE RESULTS <<<
	/guildsay Fight Time: ${TotalTime} seconds
	/if (${ParseIn}) {
		/guildsay   ** Incoming Stats **
		/guildsay   Misses: ${MissCounterIn}
		/call EchoResults "${HitsIn}"
		/guildsay   ********************
	}
	
	/if (${ParseOut}) {
		/guildsay   ** Outgoing Stats **
		/guildsay Misses: ${MissCounterOut}
		/call EchoResults "${HitsOut}"
		/guildsay **********************
	}
	
	/guildsay >>> END RESULTS <<<
/return

Sub EchoResults(string ArrayName)
	/call FindTotal "${ArrayName}"	
	/declare damage int local ${Macro.Return}
	/call FindMinimum "${ArrayName}"
	/declare min int local ${Macro.Return}
	/call FindMaximum "${ArrayName}"
	/declare max int local ${Macro.Return}
	/call FindAverage "${ArrayName}"
	/declare avg int local ${Macro.Return}
	/call FindDPS "${ArrayName}" ${TotalTime}
	/declare dps ${Macro.Return}
	/declare hits ${Vector[${ArrayName].Size}
	/guildsay Hits: ${hits}
	/guildsay Total: ${damage}
	/guildsay Minimum: ${min}
	/guildsay Maximum: ${max}
	/guildsay Average: ${avg}
	/guildsay DPS: ${dps}
/return

Sub FindMinimum(string ArrayName)
	/declare minimum int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/if (${Vector[${ArrayName}].At[${i}]} < ${minimum} || ${minimum} == 0) {
			/varset minimum ${Vector[${ArrayName}].At[${i}]}
		}
	/next i
	
/return ${minimum}

Sub FindMaximum(string ArrayName)
	/declare maximum int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/if (${Vector[${ArrayName}].At[${i}]} > ${maximum}) {
			/varset maximum ${Vector[${ArrayName}].At[${i}]}
		}
	/next i
	
/return ${maximum}

Sub FindAverage(string ArrayName)
	/if (${Vector[${ArrayName}].Size} < 1) /return 0
	/declare total int local 0
	/declare average int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/varcalc total ${total} + ${Vector[${ArrayName}].At[${i}]}
	/next i
	
	/varcalc average ${total} / ${Vector[${ArrayName}].Size}
	
/return ${average}

Sub FindTotal(string ArrayName) 
	/declare total int local 0
	/declare i int local 0
	/declare end int local ${Vector[${ArrayName}].Size}
	/varcalc end ${end} - 1
	/for i 1 to ${end}
		/varcalc total ${total} + ${Vector[${ArrayName}].At[${i}]}
	/next i
	
/return ${total}

Sub FindDPS(string ArrayName, int TotalTime)
	/declare total int local 0
	/declare DPS
	/call FindTotal ${ArrayName}
	/varset total ${Macro.Return}
	
	/varcalc DPS ${total} / ${TotalTime}
	
/return ${DPS}

Sub ResetParser
	/varset TotalTime 0
	/varset StartTimer 0
	/varset MissCounterIn 0
	/varset MissCounterOut 0
	/data ${Vector[${HitsIn}].Erase}
	/data ${Vector[${HitsOut}].Erase}
/return

User avatar
warlock45
a grimling bloodguard
a grimling bloodguard
Posts: 881
Joined: Sat Oct 06, 2007 8:32 pm

Re: DPS Parser .mac?

Post by warlock45 » Tue Jul 14, 2015 9:24 am

not sure if it is helpful but there is a plugin for that calledMQ2DPSADV.

you will need to get the window set up. it does a fairly good job, but be warned, like other parsers it will put a load on your PC.

If all you are after is tracking DPS, there is also Gamparse, which is the current favored parser program for raiders as I understand it.