[GWA2] ModStructs For Perfect Items

11/14/2019 19:27 richpianagroyper#31
oh it seems youre correct since the patch a number of modstructs had changed but i didnt bother to check os ones and just assumed that they also just changed but it seems atleast the ones i got werent affected. thanks andy!
01/21/2024 21:31 Underavelvetmoon#32
Been a while since I have updated these, but I noticed (after about 5 years) that there are some items I never find. This is because I was missing some specific combinations, and also the mod struct for +5^50 and +5wEnch were wrong :mad: So perfect wands were never really found since 20/20 is so unbelievably rare.

I have also added more combinations of focus to keep (+30 20% +1 20/10 etc) since on skins like Paper Lanterns and Paper Fans this can be a pretty expensive item.

Enjoy!

Edit: I actually think the 10% mods were wrong too, I have modified them, but they require further testing. Its hard to find these mods on weapons to test! I also added the high energy mods quickly, so it should save these on wands and foci. Again, if any issues, please comment!

Code:
 Func IsPerfectCaster($aItem)
	Local $ModStruct = GetModStruct($aItem)
	Local $A = GetItemAttribute($aItem)
    ; Universal mods
    Local $PlusFive = StringInStr($ModStruct, "05320823", 0, 1) ; Mod struct for +5^50
	Local $PlusFiveEnch = StringInStr($ModStruct, "0500F822", 0, 1)
	Local $EnergyAlways15 = StringInStr($ModStruct, "0F00D822", 0 ,1) ; Energy +15
	Local $EnergyRegen = StringInStr($ModStruct, "0100C820", 0 ,1) ; Energy regeneration -1
	Local $10Cast = StringInStr($ModStruct, "000A0822", 0, 1) ; Mod struct for 10% cast
	Local $10Recharge = StringInStr($ModStruct, "000AA823", 0, 1) ; Mod struct for 10% recharge
	Local $Plus30 = StringInStr($ModStruct, "1E4823", 0, 1) ; Mod struct for +30 (shield only?)
	; Plus 1 Mods
	Local $PlusIllusion = StringInStr($ModStruct, "0118240", 0, 1) ; +1 Illu 20%
	Local $PlusDomination = StringInStr($ModStruct, "0218240", 0, 1) ; +1 Dom 20%
	Local $PlusInspiration = StringInStr($ModStruct, "0318240", 0, 1) ; +1 Insp 20%
	Local $PlusBlood = StringInStr($ModStruct, "0418240", 0, 1) ; +1 Blood 20%
	Local $PlusDeath = StringInStr($ModStruct, "0518240", 0, 1) ; +1 Death 20%
	Local $PlusSoulReap = StringInStr($ModStruct, "0618240", 0, 1) ; +1 SoulR 20%
	Local $PlusCurses = StringInStr($ModStruct, "0718240", 0, 1) ; +1 Curses 20%
	Local $PlusAir = StringInStr($ModStruct, "0818240", 0, 1) ; +1 Air 20%
	Local $PlusEarth = StringInStr($ModStruct, "0918240", 0, 1) ; +1 Earth 20%
    Local $PlusFire = StringInStr($ModStruct, "0A18240", 0, 1) ; +1 Fire 20%
	Local $PlusWater = StringInStr($ModStruct, "0B18240", 0, 1) ; +1 Water 20%
	Local $PlusHealing = StringInStr($ModStruct, "0D18240", 0, 1) ; +1 Heal 20%
	Local $PlusSmite = StringInStr($ModStruct, "0E18240", 0, 1) ; +1 Smite 20%
	Local $PlusProt = StringInStr($ModStruct, "0F18240", 0, 1) ; +1 Prot 20%
	Local $PlusDivine = StringInStr($ModStruct, "1018240", 0, 1) ; +1 Divine 20%
	; Ele mods
	Local $Fire20Casting = StringInStr($ModStruct, "0A141822", 0, 1) ; Mod struct for 20% fire
	Local $Fire20Recharge = StringInStr($ModStruct, "0A149823", 0, 1)
	Local $Water20Casting = StringInStr($ModStruct, "0B141822", 0, 1) ; Mod struct for 20% water
	Local $Water20Recharge = StringInStr($ModStruct, "0B149823", 0, 1)
	Local $Air20Casting = StringInStr($ModStruct, "08141822", 0, 1) ; Mod struct for 20% air
	Local $Air20Recharge = StringInStr($ModStruct, "08149823", 0, 1)
	Local $Earth20Casting = StringInStr($ModStruct, "09141822", 0, 1)
	Local $Earth20Recharge = StringInStr($ModStruct, "09149823", 0, 1)
	Local $Energy20Casting = StringInStr($ModStruct, "0C141822", 0, 1)
	Local $Energy20Recharge = StringInStr($ModStruct, "0C149823", 0, 1)
	; Monk mods
	Local $Smiting20Casting = StringInStr($ModStruct, "0E141822", 0, 1) ; Mod struct for 20% smite
	Local $Smiting20Recharge = StringInStr($ModStruct, "0E149823", 0, 1)
	Local $Divine20Casting = StringInStr($ModStruct, "10141822", 0, 1) ; Mod struct for 20% divine
	Local $Divine20Recharge = StringInStr($ModStruct, "10149823", 0, 1)
	Local $Healing20Casting = StringInStr($ModStruct, "0D141822", 0, 1) ; Mod struct for 20% healing
	Local $Healing20Recharge = StringInStr($ModStruct, "0D149823", 0, 1)
	Local $Protection20Casting = StringInStr($ModStruct, "0F141822", 0, 1) ; Mod struct for 20% protection
	Local $Protection20Recharge = StringInStr($ModStruct, "0F149823", 0, 1)
	; Rit mods
	Local $Channeling20Casting = StringInStr($ModStruct, "22141822", 0, 1) ; Mod struct for 20% channeling
	Local $Channeling20Recharge = StringInStr($ModStruct, "22149823", 0, 1)
	Local $Restoration20Casting = StringInStr($ModStruct, "21141822", 0, 1)
	Local $Restoration20Recharge = StringInStr($ModStruct, "21149823", 0, 1)
    Local $Communing20Casting = StringInStr($ModStruct, "20141822", 0, 1)
	Local $Communing20Recharge = StringInStr($ModStruct, "20149823", 0, 1)
    Local $Spawning20Casting = StringInStr($ModStruct, "24141822", 0, 1) ; Spawning - Unconfirmed
	Local $Spawning20Recharge = StringInStr($ModStruct, "24149823", 0, 1) ; Spawning - Unconfirmed
	; Mes mods
    Local $Illusion20Recharge = StringInStr($ModStruct, "01149823", 0, 1)
	Local $Illusion20Casting = StringInStr($ModStruct, "01141822", 0, 1)
	Local $Domination20Casting = StringInStr($ModStruct, "02141822", 0, 1) ; Mod struct for 20% domination
    Local $Domination20Recharge = StringInStr($ModStruct, "02149823", 0, 1) ; Mod struct for 20% domination recharge
    Local $Inspiration20Recharge = StringInStr($ModStruct, "03149823", 0, 1)
	Local $Inspiration20Casting = StringInStr($ModStruct, "03141822", 0, 1)
	; Necro mods
    Local $Death20Casting = StringInStr($ModStruct, "05141822", 0, 1) ; Mod struct for 20% death
	Local $Death20Recharge = StringInStr($ModStruct, "05149823", 0, 1)
    Local $Blood20Recharge = StringInStr($ModStruct, "04149823", 0, 1)
	Local $Blood20Casting = StringInStr($ModStruct, "04141822", 0, 1)
    Local $SoulReap20Recharge = StringInStr($ModStruct, "06149823", 0, 1)
	Local $SoulReap20Casting = StringInStr($ModStruct, "06141822", 0, 1)
    Local $Curses20Recharge = StringInStr($ModStruct, "07149823", 0, 1)
	Local $Curses20Casting = StringInStr($ModStruct, "07141822", 0, 1)

	Switch $A
    Case 1 ; Illusion
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Illusion20Casting > 0 Or $Illusion20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Illusion20Recharge > 0 Or $Illusion20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Illusion20Recharge > 0 Then
		  If $Illusion20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Illusion20Casting > 0 Or $Illusion20Recharge > 0 Or $PlusIllusion > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 2 ; Domination
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Domination20Casting > 0 Or $Domination20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Domination20Recharge > 0 Or $Domination20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Domination20Recharge > 0 Then
		  If $Domination20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Domination20Casting > 0 Or $Domination20Recharge > 0 Or $PlusDomination > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 3 ; Inspiration
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Inspiration20Casting > 0 Or $Inspiration20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Inspiration20Recharge > 0 Or $Inspiration20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Inspiration20Recharge > 0 Then
		  If $Inspiration20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Inspiration20Casting > 0 Or $Inspiration20Recharge > 0 Or $PlusInspiration > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 4 ; Blood
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Blood20Casting > 0 Or $Blood20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Blood20Recharge > 0 Or $Blood20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Blood20Recharge > 0 Then
		  If $Blood20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Blood20Casting > 0 Or $Blood20Recharge > 0 Or $PlusBlood > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 5 ; Death
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Death20Casting > 0 Or $Death20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Death20Recharge > 0 Or $Death20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Death20Recharge > 0 Then
		  If $Death20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Death20Casting > 0 Or $Death20Recharge > 0 Or $PlusDeath > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 6 ; SoulReap - Doesnt drop?
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $SoulReap20Casting > 0 Or $SoulReap20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $SoulReap20Recharge > 0 Or $SoulReap20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $SoulReap20Recharge > 0 Then
		  If $SoulReap20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $SoulReap20Casting > 0 Or $SoulReap20Recharge > 0 Or $PlusSoulReap > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   If ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		   If $Blood20Casting > 0 Or $Blood20Recharge > 0 Or $Death20Casting > 0 Or $Death20Recharge > 0 Or $Curses20Casting > 0 Or $Curses20Recharge > 0 Or $SoulReap20Casting > 0 Or $SoulReap20Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 7 ; Curses
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Curses20Casting > 0 Or $Curses20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Curses20Recharge > 0 Or $Curses20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Curses20Recharge > 0 Then
		  If $Curses20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Curses20Casting > 0 Or $Curses20Recharge > 0 Or $PlusCurses > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 8 ; Air
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Air20Casting > 0 Or $Air20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Air20Recharge > 0 Or $Air20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Air20Recharge > 0 Then
		  If $Air20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Air20Casting > 0 Or $Air20Recharge > 0 Or $PlusAir > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 9 ; Earth
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Earth20Casting > 0 Or $Earth20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Earth20Recharge > 0 Or $Earth20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Earth20Recharge > 0 Then
		  If $Earth20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $PlusEarth > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
       Return False
    Case 10 ; Fire
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Fire20Casting > 0 Or $Fire20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Fire20Recharge > 0 Or $Fire20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Fire20Recharge > 0 Then
		  If $Fire20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $PlusFire > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
       Return False
    Case 11 ; Water
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Water20Casting > 0 Or $Water20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Water20Recharge > 0 Or $Water20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Water20Recharge > 0 Then
		  If $Water20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Water20Casting > 0 Or $Water20Recharge > 0 Or $PlusWater > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 12 ; Energy Storage
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Energy20Casting > 0 Or $Energy20Recharge > 0 Or $Water20Casting > 0 Or $Water20Recharge > 0 Or $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $Air20Casting > 0 Or $Air20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Energy20Recharge > 0 Or $Energy20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or $Water20Casting > 0 Or $Water20Recharge > 0 Or $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $Air20Casting > 0 Or $Air20Recharge > 0 Then
		     Return True
		  EndIf
       EndIf
	   If $Energy20Recharge > 0 Then
		  If $Energy20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $10Cast > 0 Or $10Recharge > 0 Then
		  If $Water20Casting > 0 Or $Water20Recharge > 0 Or $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $Air20Casting > 0 Or $Air20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Water20Casting > 0 Or $Water20Recharge > 0 Or $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $Air20Casting > 0 Or $Air20Recharge > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   If ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
			If $Water20Casting > 0 Or $Water20Recharge > 0 Or $Fire20Casting > 0 Or $Fire20Recharge > 0 Or $Earth20Casting > 0 Or $Earth20Recharge > 0 Or $Air20Casting > 0 Or $Air20Recharge > 0 Or $10Recharge > 0 Then
				Return True
			EndIf
	   EndIf
	   Return False
    Case 13 ; Healing
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Healing20Casting > 0 Or $Healing20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Healing20Recharge > 0 Or $Healing20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Healing20Recharge > 0 Then
		  If $Healing20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $PlusHealing > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 14 ; Smiting
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Smiting20Recharge > 0 Or $Smiting20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Smiting20Recharge > 0 Then
		  If $Smiting20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $PlusSmite > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 15 ; Protection
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Protection20Recharge > 0 Or $Protection20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Protection20Recharge > 0 Then
		  If $Protection20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Protection20Casting > 0 Or $Protection20Recharge > 0 Or $PlusProt > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 16 ; Divine
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Divine20Casting > 0 Or $Divine20Recharge > 0 Or $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Divine20Recharge > 0 Or $Divine20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Divine20Recharge > 0 Then
		  If $Divine20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $10Cast > 0 Or $10Recharge > 0 Then
		  If $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   If ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		   If $Healing20Casting > 0 Or $Healing20Recharge > 0 Or $Smiting20Casting > 0 Or $Smiting20Recharge > 0 Or $Protection20Casting > 0 Or $Protection20Recharge > 0 Then
				Return True
		   EndIf
	   EndIf
	   Return False
    Case 32 ; Communing
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Communing20Casting > 0 Or $Communing20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Communing20Recharge > 0 Or $Communing20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Communing20Recharge > 0 Then
		  If $Communing20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Communing20Casting > 0 Or $Communing20Recharge > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
	Case 33 ; Restoration
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Restoration20Casting > 0 Or $Restoration20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Restoration20Recharge > 0 Or $Restoration20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Restoration20Recharge > 0 Then
		  If $Restoration20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Restoration20Casting > 0 Or $Restoration20Recharge > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 34 ; Channeling
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Channeling20Casting > 0 Or $Channeling20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Channeling20Recharge > 0 Or $Channeling20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Channeling20Recharge > 0 Then
		  If $Channeling20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Channeling20Casting > 0 Or $Channeling20Recharge > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    Case 36 ; Spawning - Unconfirmed
	   If $PlusFive > 0 Or $PlusFiveEnch > 0 Then
		  If $Spawning20Casting > 0 Or $Spawning20Recharge > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Spawning20Recharge > 0 Or $Spawning20Casting > 0 Then
		  If $10Cast > 0 Or $10Recharge > 0 Or ($EnergyAlways15 > 0 And $EnergyRegen > 0) Then
		     Return True
		  EndIf
	   EndIf
	   If $Spawning20Recharge > 0 Then
		  If $Spawning20Casting > 0 Then
		     Return True
		  EndIf
	   EndIf
	   If $Plus30 > 0 Then
		   If $Spawning20Casting > 0 Or $Spawning20Recharge > 0 Or $10Recharge > 0 Then
			   Return True
		   EndIf
	   EndIf
	   Return False
    EndSwitch
    Return False
 EndFunc
02/28/2024 21:39 albino albatross#33
Hello! Much appreciation for all the work done here.

I have recently dug into gwa2. If an item drops, I have found that there are functions which return that item's ModelID, Rarity, and Requirement. However I was wondering if there's anyway to return the damage/armor numbers on the item (before picking it up). For example if I want to only pickup max damage swords and not anything less (i.e. 11-21). Is this information stored in the modstruct somewhere?
02/29/2024 17:39 Underavelvetmoon#34
Quote:
Originally Posted by albino albatross View Post
Hello! Much appreciation for all the work done here.

I have recently dug into gwa2. If an item drops, I have found that there are functions which return that item's ModelID, Rarity, and Requirement. However I was wondering if there's anyway to return the damage/armor numbers on the item (before picking it up). For example if I want to only pickup max damage swords and not anything less (i.e. 11-21). Is this information stored in the modstruct somewhere?
You could "probably" do this using item type and GetItemMaxDmg.

Code:
Func IsItemMaxDmgSword($aItem)
Local $dStruct = DllStructGetData($aItem, 'Type')
Local $tSword = 27
Local $fDmg = GetItemMaxDmg($aItem)

If $dStruct == $tSword And $fDmg == 22 Then
    Return True ; Max dmg sword
Else
    Return False
EndIf

EndFunc
I havent tested this myself, but I dont see any reason why it wouldnt work.
02/29/2024 23:11 albino albatross#35
Thank you GetItemMaxDmg worked!

If anyone is interested, I modified the function to return the entire damage range.


This successfully returns the minimum and maximum damage number for the item.
It returns 8-16 for max shields and 6-12 for max off-hands since these are the minimum values for these items.
03/26/2024 11:18 albino albatross#36
Hello everyone! I am once again in need of your assistance.

I have been looking at the perfect modstructs Underavelvetmoon has so graciously provided. They are very useful, but I was wondering if there was a way to detect the number of mods an item has, regardless of what those mods are?

I want to use this to note the number of items I get with dual mods vs single mods, and a function which counts the number of mods on an item would be very useful.

This is what I came up with so far:

Code:
Func CountMods($aItem)
    Local $ModStruct = GetModStruct($aItem)
    Local $modCount = 0

    ; List of unique mod patterns identified from the perfect item checker.  
    Local $modPatterns = ["05320823", "0500F822", "0F00D822", "0100C820", "000A0822", "000AA823", "1E4823", "0118240", "0218240", "0318240", "0418240", "0518240", "0618240", "0718240", "0818240", "0918240", "0A18240", "0B18240", "0D18240", "0E18240", "0F18240", "1018240", "0A141822", "0A149823", "0B141822", "0B149823", "08141822", "08149823", "09141822", "09149823"]

    ; Iterate through each mod pattern and check if it exists in the ModStruct.
    For $i = 0 To UBound($modPatterns) - 1
        If StringInStr($ModStruct, $modPatterns[$i]) Then
            $modCount += 1
        EndIf
    Next

    Return $modCount
EndFunc
I think this should work for detecting the presence of the perfect mods, but is there any easy way to modify this for detecting the presence of ALL mods, short of adding every single individual mod pattern to the list?
03/27/2024 12:25 jukia#37
You could check only for the identifiers of the mods that interests you, the last 4 digits.

For instance, hp+30 will be 001E4823, identifier 4823 for this mod.

So, this will give you a match if any hp+xx is present
Code:
StringRegExp($ModStruct, '.{4}4823')
Basically the same as you have but your $modPaterns would look more like this.
Code:
Local $modPatterns = ["C820", "0822", "1822", "D822", "F822", "0823", "4823", "9823", "A823", "8240",
And your test loop
Code:
For $i = 0 To UBound($modPatterns) - 1
    If StringRegExp($ModStruct, '.{4}' & $modPatterns[$i]) Then
        $modCount += 1
        If $modCount = 2 Then ExitLoop ; I guess you can stop the iteration if it gets to 2 mods already
    EndIf
Next
03/27/2024 16:24 Underavelvetmoon#38
Quote:
Originally Posted by jukia View Post
You could check only for the identifiers of the mods that interests you, the last 4 digits.

For instance, hp+30 will be 001E4823, identifier 4823 for this mod.

So, this will give you a match if any hp+xx is present
Code:
StringRegExp($ModStruct, '.{4}4823')
Basically the same as you have but your $modPaterns would look more like this.
Code:
Local $modPatterns = ["C820", "0822", "1822", "D822", "F822", "0823", "4823", "9823", "A823", "8240",
And your test loop
Code:
For $i = 0 To UBound($modPatterns) - 1
    If StringRegExp($ModStruct, '.{4}' & $modPatterns[$i]) Then
        $modCount += 1
        If $modCount = 2 Then ExitLoop ; I guess you can stop the iteration if it gets to 2 mods already
    EndIf
Next
I like that quite a bit, the only problem, and this is the problem I had with other methods of doing this is that we want to exclude undesirable combos of mods, like -2 stance and +45while enchanted, and so on, so eventually it will come back to needing to have the mess of the code that it already is to specify the mods haha :D

Maybe there is someway to integrate what you suggested half way and reduce the clutter, I'll give it some thought!
03/31/2024 03:55 albino albatross#39
Thank you jukia, your method worked great. I'll post what I have working so far. This function returns the number of mods of the item in the first slot of your first bag. I have noted the mod associated with each mod pattern in the comments.

Code:
Func CountMods()
    Local $modCount = 0 ; Initialize mod counter
    Local $aItem = GetItemBySlot(1, 1) ; Get item in slot 1 of bag 1.
    Local $ModStruct = GetModStruct($aItem) ; Get mod structure string of item

    ; Array of mod identifier endings to check
    Local $modPatterns = ["A820","9820","8820","7820","6823","8823","7823","4823","1824","1821","4821","7824","0822","A823","1822","9823","A821","B821","9821","8821","0821","C821","5821","2821","0823","1823","2823","D822","F822"]
    ;A820:-DMG(ST) || 9820:-DMG(Hexed) || 8820:-DMG(EN) || 7820:-DMG(%) || 6823:+HP(EN) || 8823:+HP(ST) || 7823:+HP(HEX) || 4823:+HP || 1824:+1Attribute(%) || 1821:+AR Vs DamageType || 4821:+AR Vs EnemyType || 7824:Reduces X Duration 20% || 
    ;0822:HCT All Spells || A823:HSR All Spells || 1822:HCT Attribute || 9823:HSR Attribute || 
    ;A821:+AR(>50%HP) || B821:+AR(<50%HP) || 9821:+AR(EN) || 8821:+AR(Casting)  ||C821:+AR(Hexed) || 5821:+AR(vsPhysical) || 2821:+AR(vsElemental) || 0821:[+AR/+AR(-EnergyRegen)]
    ;0823:+Energy(>50%HP) || 1823:+Energy(<50%HP) || 2823:+Energy(Hexed) || F822:+Energy(EN) || D822:[+Energy/+Energy(-EnergyRegen)]

    ; Loop through each pattern and search in ModStruct
    For $i = 0 To UBound($modPatterns) - 1
        ; Regex checks 4 any chars followed by mod identifier
        If StringRegExp($ModStruct, '.{4}' & $modPatterns[$i]) Then 
            $modCount += 1 ; Increment counter for each match
        EndIf
    Next
    MsgBox(0, "Mod Count", "The number of mods counted: " & $modCount)
    Return $modCount ; Return the total mod count found
EndFunc   ;==>CountMods
So far, I believe this function works for all shields, off-hands, and wands. I will add more mod patterns later for martial weapons and staves.
05/11/2024 07:30 ATbs#40
Thanks for this, amazing!

How can I do the same but for Q4 shields?

Func GetItemMaxReq4($aItem)
Local $Type = DllStructGetData($aItem, "Type")
Local $Dmg = GetItemMaxDmg($aItem)
Local $Req = GetItemReq($aItem)

Switch $Type
Case 24 ;~ Shield
If $Dmg == 8 And $Req == 4 Then
Return True
Else
Return False
EndIf
EndSwitch
EndFunc

Made this for a feather farmer but I'm unsure about how to apply it.
05/11/2024 20:51 Underavelvetmoon#41
Quote:
Originally Posted by ATbs View Post
Thanks for this, amazing!

How can I do the same but for Q4 shields?

Func GetItemMaxReq4($aItem)
Local $Type = DllStructGetData($aItem, "Type")
Local $Dmg = GetItemMaxDmg($aItem)
Local $Req = GetItemReq($aItem)

Switch $Type
Case 24 ;~ Shield
If $Dmg == 8 And $Req == 4 Then
Return True
Else
Return False
EndIf
EndSwitch
EndFunc

Made this for a feather farmer but I'm unsure about how to apply it.
If you add that into the CanPickUp/CanSell/etc functions it should work fine!

Code:
Func CanPickUp($aItem)
Local $Req4Shield = GetItemMaxReq4($aItem)
Local $Type = DllStructGetData($aItem, "Type")

Switch $Type
Case 24
    If $Req4Shield Then 
         Return True 
    Else
         Return False
    EndIf
   
EndSwitch
I combine all mine into one function, like all Req8 things are checked together rather than req8 sword, shield, staff, etc, so it looks more complex than it is.
05/11/2024 23:47 ATbs#42
Thx a lot, to test i can change values and use whatever shield yes.
I don't want to skip all golds in case a q4 max ar shield drops!
05/31/2024 08:20 ATbs#43
So i'm making a test on a feather bot i have, and is not working. Maybe u can help me figure out why.
( i have a q0 max11 dmg spear im testing with)

If CountFreeSlots() >= 3 Then
Local $Rarity = GetRarity($lItem)
Local $aReq = GetItemReq($lItem)
Local $lType = DllStructGetData($lItem, 'Type')
Local $IsReq0 = IsReq0Max($lItem)
Switch $Rarity
Case 2624
Switch $lType
Case 24
If $aReq = 4 And GetItemMaxDmg($lItem) = 12 Then
$Shields += DllStructGetData($lItem, 'Quantity')
GUICtrlSetData($ShieldsCount, $Shields)
Out("Q4 AR12 GOLD SHIELD looted.")
Return True
EndIf
If $aReq = 5 And GetItemMaxDmg($lItem) = 13 Then
$Shields += DllStructGetData($lItem, 'Quantity')
GUICtrlSetData($ShieldsCount, $Shields)
Out("Q5 AR13 GOLD SHIELD looted.")
Return True
EndIf
EndSwitch
Case 2623
Switch $lType
Case 36
Switch $IsReq0
Return True
EndSwitch
EndSwitch
EndSwitch
Else

Thats on the pickup func, these are shields and it works fine, with the spear it doesnt.

Then i have:

Func GetItemMaxReq0($aItem)
Local $Type = DllStructGetData($aItem, "Type")
Local $Dmg = GetItemMaxDmg($aItem)
Local $Req = GetItemReq($aItem)

Switch $Type
Case 35 ;~ Scythe
If $Dmg == 17 And $Req == 0 Then
Return True
Else
Return False
EndIf
Case 36 ;~ Spear
If $Dmg == 11 And $Req == 0 Then
Return True
Else
Return False
EndIf
EndSwitch
EndFunc

Func IsReq0Max($aItem)
Local $Type = DllStructGetData($aItem, "Type")
Local $Rarity = GetRarity($aItem)
Local $MaxDmgScythe = GetItemMaxReq0($aItem)
Local $MaxDmgSpear = GetItemMaxReq0($aItem)

Switch $Rarity
Case 2623 ;~ Purple?
Switch $Type
Case 35 ;~ Scythe
If $MaxDmgScythe = True Then
Return True
Else
Return False
EndIf
Case 36 ;-Spear
If $MaxDmgSpear = True Then
Return True
Else
Return False
EndIf
EndSwitch
EndSwitch
Return False
EndFunc

Func GetItemMaxDmg($aItem)
If Not IsDllStruct($aItem) Then $aItem = GetItemByItemID($aItem)
Local $lModString = GetModStruct($aItem)
Local $lPos = StringInStr($lModString, "A8A7") ; Weapon Damage
If $lPos = 0 Then $lPos = StringInStr($lModString, "C867") ; Energy (focus)
If $lPos = 0 Then $lPos = StringInStr($lModString, "B8A7") ; Armor (shield)
If $lPos = 0 Then Return 0
Return Int("0x" & StringMid($lModString, $lPos - 2, 2))
EndFunc
04/02/2025 22:06 ATbs#44
I don't see why this isn't working...


Func ShieldsIntoChest()
Local $lItem, $lType
Local $IsShield = IsPerfectShield($lItem)

For $i = 1 To 4
For $j = 1 To DllStructGetData(GetBag($i), 'slots')
$lItem = GetItemBySlot($i, $j)
If DllStructGetData($lItem, 'ID') = 0 Then ContinueLoop
If DllStructGetData($lItem, 'Type') == 24 Then
Switch $IsShield
Case True
MoveItemsToChest($lItem)
Out("Shield Stored.")
Sleep(GetPing() + 500)
EndSwitch
EndIf
Next
Next
EndFunc
04/17/2025 13:36 Underavelvetmoon#45
Here's my functions for finding and keeping the new +5 mods. The mods are correct but the functions are not fully tested just yet.

Add this to your CanSell function:
Code:
Func CanSell($aItem) 
Local $PlusFiveMod = IsPlusFiveMod($aItem)

   Switch $PlusFiveMod
   Case True
	  If PlusFiveModFilter($aItem) = "1" Then
		  KeepStrengthWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "2" Then
		  KeepExpertiseWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "3" Then
		  KeepSoulReapingWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "4" Then
		  KeepFastCastingWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "5" Then
		  KeepEnergyStorageWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "6" Then
		  KeepDivineFavorWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "7" Then
		  KeepSpawningPowerWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "8" Then
		  KeepCritStrikeWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "9" Then
		  KeepLeadershipWeapons($aItem)
	  ElseIf PlusFiveModFilter($aItem) = "10" Then
		  KeepMysticismWeapons($aItem)
	  Else
		  Return True
	  EndIf
   EndSwitch
EndFunc
And put this garbled mess into wherever you keep your item filtering:
Code:
Func IsPlusFiveMod($aItem)
	Local $ModStruct = GetModStruct($aItem)
	Local $Strength = StringInStr($ModStruct, "0511A828", 0, 1)
    Local $Expertise = StringInStr($ModStruct, "0517A828", 0, 1)
    Local $SoulReaping = StringInStr($ModStruct, "0506A828", 0, 1)
    Local $FastCasting = StringInStr($ModStruct, "0500A828", 0, 1)
    Local $EnergyStorage = StringInStr($ModStruct, "050CA828", 0, 1)
    Local $DivineFavor = StringInStr($ModStruct, "0510A828", 0, 1)
    Local $SpawningPower = StringInStr($ModStruct, "0524A828", 0, 1)
    Local $CritStrikes = StringInStr($ModStruct, "0523A828", 0, 1)
    Local $Leadership = StringInStr($ModStruct, "0528A828", 0, 1)
    Local $Mysticism = StringInStr($ModStruct, "052CA828", 0, 1)

	If $Strength > 0 Then
		Return True
	EndIf
	If $Expertise > 0 Then
		Return True
	EndIf
	If $SoulReaping > 0 Then
		Return True
	EndIf
	If $FastCasting > 0 Then
		Return True
	EndIf
	If $EnergyStorage > 0 Then
		Return True
	EndIf
	If $DivineFavor > 0 Then
		Return True
	EndIf
	If $SpawningPower > 0 Then
		Return True
	EndIf
	If $CritStrikes > 0 Then
		Return True
	EndIf
	If $Leadership > 0 Then
		Return True
	EndIf
	If $Mysticism > 0 Then
		Return True
	EndIf
	Return False
EndFunc
Func PlusFiveModFilter($aItem)
	Local $ModStruct = GetModStruct($aItem)
	Local $Strength = StringInStr($ModStruct, "0511A828", 0, 1)
    Local $Expertise = StringInStr($ModStruct, "0517A828", 0, 1)
    Local $SoulReaping = StringInStr($ModStruct, "0506A828", 0, 1)
    Local $FastCasting = StringInStr($ModStruct, "0500A828", 0, 1)
    Local $EnergyStorage = StringInStr($ModStruct, "050CA828", 0, 1)
    Local $DivineFavor = StringInStr($ModStruct, "0510A828", 0, 1)
    Local $SpawningPower = StringInStr($ModStruct, "0524A828", 0, 1)
    Local $CritStrikes = StringInStr($ModStruct, "0523A828", 0, 1)
    Local $Leadership = StringInStr($ModStruct, "0528A828", 0, 1)
    Local $Mysticism = StringInStr($ModStruct, "052CA828", 0, 1)

	If $Strength > 0 Then
		Return "1"
	EndIf
	If $Expertise > 0 Then
		Return "2"
	EndIf
	If $SoulReaping > 0 Then
		Return "3"
	EndIf
	If $FastCasting > 0 Then
		Return "4"
	EndIf
	If $EnergyStorage > 0 Then
		Return "5"
	EndIf
	If $DivineFavor > 0 Then
		Return "6"
	EndIf
	If $SpawningPower > 0 Then
		Return "7"
	EndIf
	If $CritStrikes > 0 Then
		Return "8"
	EndIf
	If $Leadership > 0 Then
		Return "9"
	EndIf
	If $Mysticism > 0 Then
		Return "10"
	EndIf
	Return False
EndFunc
Func KeepStrengthWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return False
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return False
	Case 27 ; Sword
		Return False
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepExpertiseWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return True
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepSoulReapingWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return True
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return True
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepFastCastingWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return True
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return True
	Case 35 ; Scythe
		Return True
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepEnergyStorageWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return True
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepDivineFavorWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return False
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return False
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepSpawningPowerWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return False
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepCritStrikeWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return True
	Case 5 ; Bow
		Return True
	Case 15 ; Hammer
		Return True
	Case 22 ; Wand
		Return False
	Case 26 ; Staff
		Return False
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return True
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Func KeepLeadershipWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return False
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return True
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return False
	EndSwitch
	Return False
EndFunc
Func KeepMysticismWeapons($aItem)
	Local $lWeaponType = GetItemType($aItem)

	Switch $lWeaponType
	Case 2 ; Axe
		Return False
	Case 5 ; Bow
		Return False
	Case 15 ; Hammer
		Return False
	Case 22 ; Wand
		Return True
	Case 26 ; Staff
		Return True
	Case 27 ; Sword
		Return True
	Case 32 ; Daggers
		Return False
	Case 35 ; Scythe
		Return False
	Case 36 ; Spear
		Return True
	EndSwitch
	Return False
EndFunc
Change the 'KeepXWeapons' as you see fit so you only keep the mods you want.

Enjoy and post here if there are any problems with it.

EDIT: Depending on what GWA2 version you are using, you may need to change 'GetItemType' to 'DllStructGetData($aItem, "Type")'