OK to ask for exploit/Scripting help here...

12/10/2019 08:12 RiflemanX#241
Quote:
Originally Posted by Death_Fire View Post
Hey,

I updated my Tengu Bot and its still working but the Pickup Function is broken.
Any Tips what I have to change?
Find the Pickup_Loot function and take a look at as well as the CanPickUp() function. See what items it has listed and compare the function with a bot that is working.

If you post those functions here then we can see where there might be a problem.

Regards,
RiflemanX
12/10/2019 10:06 Death_Fire#242
Quote:
Originally Posted by RiflemanX View Post
Find the Pickup_Loot function and take a look at as well as the CanPickUp() function. See what items it has listed and compare the function with a bot that is working.

If you post those functions here then we can see where there might be a problem.

Regards,
RiflemanX

I have this one :
Func CanPickUp2($aitem)
$ModelID = DllStructGetData(($aitem), 'ModelID')
$ExtraID = DllStructGetData($aitem, "ExtraId")
$lRarity = GetRarity($aitem)
$t = DllStructGetData($aitem, 'Type')
If $t = 20 Then
Return True
ElseIf $ModelID == 36985 Then
$nbCitations += 1
GUICtrlSetData($stCitations, $nbCitations)
Return True
ElseIf GUICtrlRead($gold) = $GUI_CHECKED Then
If $lRarity = 2624 Then
Return True ; gold items
EndIf
ElseIf GUICtrlRead($green) = $GUI_CHECKED Then
If $lRarity = 2627 Then
Return True ; green items
EndIf
ElseIf $ModelID = 28434 Then
Return True
ElseIf $lRarity = 2624 Then
If GUICtrlRead($dragon) = $GUI_CHECKED Then
If $ModelID = 736 Then
Return True
EndIf
EndIf
If GUICtrlRead($bo) = $GUI_CHECKED Then
If $ModelID = 735 Then
Return True
EndIf
EndIf
If GUICtrlRead($bladed) = $GUI_CHECKED Then
If $ModelID = 778 Then
Return True
EndIf
EndIf
If GUICtrlRead($bladed) = $GUI_CHECKED Then
If $ModelID = 777 Then
Return True
EndIf
EndIf
If GUICtrlRead($spiked) = $GUI_CHECKED Then
If $ModelID = 871 Then
Return True
EndIf
EndIf
If GUICtrlRead($spiked) = $GUI_CHECKED Then
If $ModelID = 872 Then
Return True
EndIf
EndIf
If GUICtrlRead($jitte) = $GUI_CHECKED Then
If $ModelID = 741 Then
Return True
EndIf
EndIf
If GUICtrlRead($diamond) = $GUI_CHECKED Then
If $ModelID = 2294 Then
Return True
EndIf
EndIf
If GUICtrlRead($Iridescent) = $GUI_CHECKED Then
If $ModelID = 2298 Then
Return True
EndIf
EndIf
If GUICtrlRead($Iridescent) = $GUI_CHECKED Then
If $ModelID = 2299 Then
Return True
EndIf
EndIf
If GUICtrlRead($Iridescent) = $GUI_CHECKED Then
If $ModelID = 2297 Then
Return True
EndIf
EndIf
ElseIf GUICtrlRead($pcons) = $GUI_CHECKED Then
If $ModelID = 28434 Or $ModelID = 22752 Or $ModelID = 22269 Or $ModelID = 28436 Or $ModelID = 31152 Or $ModelID = 31151 Or $ModelID = 31153 Or $ModelID = 35121 Or $ModelID = 28433 Or $ModelID = 26784 Or $ModelID = 6370 Or $ModelID = 21488 Or $ModelID = 21489 Or $ModelID = 22191 Or $ModelID = 24862 Or $ModelID = 21492 Or $ModelID = 22644 Or $ModelID = 30855 Or $ModelID = 5585 Or $ModelID = 24593 Or $ModelID = 6375 Or $ModelID = 22190 Or $ModelID = 6049 Or $ModelID = 910 Or $ModelID = 28435 Or $ModelID = 6369 Or $ModelID = 21809 Or $ModelID = 21810 Or $ModelID = 21813 Or $ModelID = 6376 Or $ModelID = 6368 Or $ModelID = 29436 Or $ModelID = 21491 Then
Return True ; pcons
EndIf
ElseIf $ModelID = 146 Then
If $ExtraID = 10 Or $ExtraID = 12 Then
Return False
EndIf
If $ModelID = 22751 Then
Return True
EndIf
EndIf
EndFunc ;==>CanPickUp2


Maybe you see what I cant see
Thx for help :)
12/10/2019 15:34 RiflemanX#243
@ Death_Fire,

Ok, can you check two other things please. There should be another loot function that references this function, something like Loot() or Get_Loot, or PickupLoot. Post that function. Also, read your script down to where your bot makes it to the final waypoint coords and everyone is balled. After the Pop, you should see your PickUpLoot function called there, correct?
02/09/2020 12:25 JohnyDee#244
Trying to use the new GWA2 to update some old bots but I always get a crash when the bot tries to initialize. The Character selector works fine, but then the client always crashes. I have tried all combinations of the arguments, and have also tried a couple of scripts that people uploaded and claimed it works for them, still crashing. I also re-downloaded the GW client. Any insight would be appreciated.
02/09/2020 18:47 phat34#245
The main thing is people don't know how to track the errors... People that are interested in botting need to download Scite. Open the scripts in scite and learn to put information lines in their script.

Add lines like this in your script to isolate where the file is crashing, and if its a script error like Andy mentioned above (double functions, variables used without being declared, syntax errors) then scite will tell you what and where the errors are...Here is an informational line and you can duplicate them through your script to isolate where the crash is happening and come here with the information and then we can really help.

Code:
; add lines like this in the script so you can see it passed this point without crashing
ConsoleWrite("Passing Line 200 ..everything ok..")
; sometimes you might want to know the value of a variable...
ConsoleWrite("Injected with Character name " & $charname & '@'CRLF);
;remove quotes from '@'
02/09/2020 23:19 JohnyDee#246
Hi Andy and Phat, I am sorry if I lead you to believe I was completely new to this. I have already cleaned the new GWA2, removed duplicate functions and added any missing ones. I have a very specific problem with the Initialize() function. When I run any script (either my own or any of the updated ones posted here the last couple of days) the client crashes at the initializing, i.e. the window does not get a new name, the crash window (prompting to send info to ArenaNet) pops up and when I press ok then the bot gui appears as normal. I have tried changing the arguments in the initialize() func (regarding eventmode, window rename etc) to any possible combination of True/Falses (as this sometimes caused crashes) but with no luck. I was wondering if there is anything else I am missing.
02/10/2020 00:06 Zvend#247
Scite is terrible btw.
Maybe upload your Initialize function, so people here get actually a chance to help you :)
02/10/2020 09:02 JohnyDee#248
This is the Initialize func from the newly released GWA2:

Code:
;~ Description: Injects GWA˛ into the game client.
Func Initialize($aGW, $bChangeTitle = True, $aUseStringLog = False, $aUseEventSystem = True)
	Local $lWinList, $lWinList2, $mGWProcessId
	$mUseStringLog = $aUseStringLog
	$mUseEventSystem = $aUseEventSystem

	If IsString($aGW) Then
		Local $lProcessList = ProcessList("gw.exe")
		For $i = 1 To $lProcessList[0][0]
			$mGWProcessId = $lProcessList[$i][1]
			$mGWWindowHandle = GetHwnd($mGWProcessId)
			MemoryOpen($mGWProcessId)
			If $mGWProcHandle Then
				If StringRegExp(ScanForCharname(), $aGW) = 1 Then ExitLoop
			EndIf
			MemoryClose()
			$mGWProcHandle = 0
		Next
	Else
		$mGWProcessId = $aGW
		$mGWWindowHandle = GetHwnd($mGWProcessId)
		MemoryOpen($aGW)
		ScanForCharname()
	EndIf

	If $mGWProcHandle = 0 Then Return 0

	Scan()

	Local $lTemp
	$mBasePointer = MemoryRead(GetScannedAddress('ScanBasePointer', 8)) ;-3
	SetValue('BasePointer', '0x' & Hex($mBasePointer, 8))
	$mAgentBase = GetScannedAddress('ScanAgentBase', -15) + 0x1E
	$mAgentBase = $mAgentBase + MemoryRead($mAgentBase) + 4
	$mAgentBase += 0x13
	$mAgentBase = MemoryRead($mAgentBase)
	SetValue('AgentBase', '0x' & Hex($mAgentBase, 8))
	$mMaxAgents = $mAgentBase + 8
	SetValue('MaxAgents', '0x' & Hex($mMaxAgents, 8))
	$mMyID = MemoryRead(GetScannedAddress('ScanMyID', -3));$mMyID = $mAgentBase - 84
	SetValue('MyID', '0x' & Hex($mMyID, 8))
	$mCurrentTarget = MemoryRead(GetScannedAddress('ScanCurrentTarget', -14)) ;$mAgentBase - 1280
	SetValue('PacketLocation', '0x' & Hex(MemoryRead(GetScannedAddress('ScanBaseOffset', 11)), 8))
	$mPing = MemoryRead(GetScannedAddress('ScanPing', -8))
	$mMapID = MemoryRead(GetScannedAddress('ScanMapID', 28))
	$mMapLoading = MemoryRead(GetScannedAddress('ScanMapLoading', 44))
	$mLoggedIn = MemoryRead(GetScannedAddress('ScanLoggedIn', -3)) - 0x198
	$mLanguage = MemoryRead(GetScannedAddress('ScanMapInfo', 11)) + 0xC
	$mRegion = $mLanguage + 4
	$mSkillBase = MemoryRead(GetScannedAddress('ScanSkillBase', 8))
	$mSkillTimer = MemoryRead(GetScannedAddress('ScanSkillTimer', -3))
	$lTemp = GetScannedAddress('ScanBuildNumber', 0x2C)
	$mBuildNumber = MemoryRead($lTemp + MemoryRead($lTemp) + 5)
	$mZoomStill = GetScannedAddress("ScanZoomStill", 0x33)
	$mZoomMoving = GetScannedAddress("ScanZoomMoving", 0x21)
	$mCurrentStatus = MemoryRead(GetScannedAddress('ScanChangeStatusFunction', 35))

	$lTemp = GetScannedAddress('ScanEngine', -0x6E) ;-16
	SetValue('MainStart', '0x' & Hex($lTemp, 8))
	SetValue('MainReturn', '0x' & Hex($lTemp + 5, 8))
	$lTemp = GetScannedAddress('ScanRenderFunc', -0x67)
    SetValue('RenderingMod', '0x' & Hex($lTemp, 8))
    SetValue('RenderingModReturn', '0x' & Hex($lTemp + 10, 8))
	$lTemp = GetScannedAddress('ScanTargetLog', 1)
	SetValue('TargetLogStart', '0x' & Hex($lTemp, 8))
	SetValue('TargetLogReturn', '0x' & Hex($lTemp + 5, 8))
	$lTemp = GetScannedAddress('ScanSkillLog', 1)
	SetValue('SkillLogStart', '0x' & Hex($lTemp, 8))
	SetValue('SkillLogReturn', '0x' & Hex($lTemp + 5, 8))
	$lTemp = GetScannedAddress('ScanSkillCompleteLog', -4)
	SetValue('SkillCompleteLogStart', '0x' & Hex($lTemp, 8))
	SetValue('SkillCompleteLogReturn', '0x' & Hex($lTemp + 5, 8))
	$lTemp = GetScannedAddress('ScanSkillCancelLog', 5)
	SetValue('SkillCancelLogStart', '0x' & Hex($lTemp, 8))
	SetValue('SkillCancelLogReturn', '0x' & Hex($lTemp + 6, 8))
	$lTemp = GetScannedAddress('ScanChatLog', 18)
	SetValue('ChatLogStart', '0x' & Hex($lTemp, 8))
	SetValue('ChatLogReturn', '0x' & Hex($lTemp + 6, 8))
	$lTemp = GetScannedAddress('ScanTraderHook', -7)
	SetValue('TraderHookStart', '0x' & Hex($lTemp, 8))
	SetValue('TraderHookReturn', '0x' & Hex($lTemp + 5, 8))

	$lTemp = GetScannedAddress('ScanDialogLog', -4)
	SetValue('DialogLogStart', '0x' & Hex($lTemp, 8))
	SetValue('DialogLogReturn', '0x' & Hex($lTemp + 5, 8))
	$lTemp = GetScannedAddress('ScanStringFilter1', -5); was -0x23
    SetValue('StringFilter1Start', '0x' & Hex($lTemp, 8))
    SetValue('StringFilter1Return', '0x' & Hex($lTemp + 5, 8))
    $lTemp = GetScannedAddress('ScanStringFilter2', 0x16); was 0x61
    SetValue('StringFilter2Start', '0x' & Hex($lTemp, 8))
    SetValue('StringFilter2Return', '0x' & Hex($lTemp + 5, 8))
    SetValue('StringLogStart', '0x' & Hex(GetScannedAddress('ScanStringLog', 0x16), 8))

	SetValue('LoadFinishedStart', '0x' & Hex(GetScannedAddress('ScanLoadFinished', 1), 8))
	SetValue('LoadFinishedReturn', '0x' & Hex(GetScannedAddress('ScanLoadFinished', 6), 8))

	SetValue('PostMessage', '0x' & Hex(MemoryRead(GetScannedAddress('ScanPostMessage', 11)), 8))
	SetValue('Sleep', MemoryRead(MemoryRead(GetValue('ScanSleep') + 8) + 3))
	SetValue('SalvageFunction', MemoryRead(GetValue('ScanSalvageFunction') + 8) - 18)
	SetValue('SalvageGlobal', MemoryRead(MemoryRead(GetValue('ScanSalvageGlobal') + 8) + 1))
	SetValue('IncreaseAttributeFunction', '0x' & Hex(GetScannedAddress('ScanIncreaseAttributeFunction', -0x5A), 8))
	SetValue("DecreaseAttributeFunction", "0x" & Hex(GetScannedAddress("ScanDecreaseAttributeFunction", 25), 8))
	SetValue('MoveFunction', '0x' & Hex(GetScannedAddress('ScanMoveFunction', 1), 8))
	SetValue('UseSkillFunction', '0x' & Hex(GetScannedAddress('ScanUseSkillFunction', -0x125), 8))
	SetValue('ChangeTargetFunction', '0x' & Hex(GetScannedAddress('ScanChangeTargetFunction', -15), 8))
	SetValue('WriteChatFunction', '0x' & Hex(GetScannedAddress('ScanWriteChatFunction', -0x3D), 8))
	SetValue('SellItemFunction', '0x' & Hex(GetScannedAddress('ScanSellItemFunction', -85), 8))
	SetValue('PacketSendFunction', '0x' & Hex(GetScannedAddress('ScanPacketSendFunction', -0xC2), 8))
	SetValue('ActionBase', '0x' & Hex(MemoryRead(GetScannedAddress('ScanActionBase', -3)), 8))
	SetValue('ActionFunction', '0x' & Hex(GetScannedAddress('ScanActionFunction', -3), 8))
	SetValue('UseHeroSkillFunction', '0x' & Hex(GetScannedAddress('ScanUseHeroSkillFunction', -0xA1), 8))
	SetValue('BuyItemBase', '0x' & Hex(MemoryRead(GetScannedAddress('ScanBuyItemBase', 15)), 8))
	SetValue('TransactionFunction', '0x' & Hex(GetScannedAddress('ScanTransactionFunction', -0x7E), 8))
	SetValue('RequestQuoteFunction', '0x' & Hex(GetScannedAddress('ScanRequestQuoteFunction', -0x34), 8)) ;-2
	SetValue('TraderFunction', '0x' & Hex(GetScannedAddress('ScanTraderFunction', -71), 8))
	SetValue('ClickToMoveFix', '0x' & Hex(GetScannedAddress("ScanClickToMoveFix", 1), 8))
	SetValue('ChangeStatusFunction', '0x' & Hex(GetScannedAddress("ScanChangeStatusFunction", 1), 8))

	SetValue('QueueSize', '0x00000010')
	SetValue('SkillLogSize', '0x00000010')
	SetValue('ChatLogSize', '0x00000010')
	SetValue('TargetLogSize', '0x00000200')
	SetValue('StringLogSize', '0x00000200')
	SetValue('CallbackEvent', '0x00000501')
	$MTradeHackAddress = GetScannedAddress("ScanTradeHack", 0)

	ModifyMemory()

	$mQueueCounter = MemoryRead(GetValue('QueueCounter'))
	$mQueueSize = GetValue('QueueSize') - 1
	$mQueueBase = GetValue('QueueBase')
	$mTargetLogBase = GetValue('TargetLogBase')
	$mStringLogBase = GetValue('StringLogBase')
	$mMapIsLoaded = GetValue('MapIsLoaded')
	$mEnsureEnglish = GetValue('EnsureEnglish')
	$mTraderQuoteID = GetValue('TraderQuoteID')
	$mTraderCostID = GetValue('TraderCostID')
	$mTraderCostValue = GetValue('TraderCostValue')
	$mDisableRendering = GetValue('DisableRendering')
	$mAgentCopyCount = GetValue('AgentCopyCount')
	$mAgentCopyBase = GetValue('AgentCopyBase')
	$mLastDialogID = GetValue('LastDialogID')

	If $mUseEventSystem Then MemoryWrite(GetValue('CallbackHandle'), $mGUI)

	DllStructSetData($mInviteGuild, 1, GetValue('CommandPacketSend'))
	DllStructSetData($mInviteGuild, 2, 0x4C)
	DllStructSetData($mUseSkill, 1, GetValue('CommandUseSkill'))
	DllStructSetData($mMove, 1, GetValue('CommandMove'))
	DllStructSetData($mChangeTarget, 1, GetValue('CommandChangeTarget'))
	DllStructSetData($mPacket, 1, GetValue('CommandPacketSend'))
	DllStructSetData($mSellItem, 1, GetValue('CommandSellItem'))
	DllStructSetData($mAction, 1, GetValue('CommandAction'))
	DllStructSetData($mToggleLanguage, 1, GetValue('CommandToggleLanguage'))

	DllStructSetData($mUseHeroSkill, 1, GetValue('CommandUseHeroSkill'))

	DllStructSetData($mBuyItem, 1, GetValue('CommandBuyItem'))
	DllStructSetData($mSendChat, 1, GetValue('CommandSendChat'))
	DllStructSetData($mSendChat, 2, $HEADER_SEND_CHAT)
	DllStructSetData($mWriteChat, 1, GetValue('CommandWriteChat'))
	DllStructSetData($mRequestQuote, 1, GetValue('CommandRequestQuote'))
	DllStructSetData($mRequestQuoteSell, 1, GetValue('CommandRequestQuoteSell'))
	DllStructSetData($mTraderBuy, 1, GetValue('CommandTraderBuy'))
	DllStructSetData($mTraderSell, 1, GetValue('CommandTraderSell'))
	DllStructSetData($mSalvage, 1, GetValue('CommandSalvage'))
	DllStructSetData($mIncreaseAttribute, 1, GetValue('CommandIncreaseAttribute'))
	DllStructSetData($mDecreaseAttribute, 1, GetValue('CommandDecreaseAttribute'))
	DllStructSetData($mMakeAgentArray, 1, GetValue('CommandMakeAgentArray'))
	DllStructSetData($mChangeStatus, 1, GetValue('CommandChangeStatus'))

	If $bChangeTitle Then WinSetTitle($mGWWindowHandle, '', 'Guild Wars - ' & GetCharname())
	Return $mGWWindowHandle
EndFunc   ;==>Initialize
I have tried using it either inside an EventHandler func or in the beginning of the script. Any time the script tries to inject, it crashes my GW client. The character name functions seem to work OK as the correct names appear in my gui, so perhaps it is something with the modifymemory() func...
02/10/2020 14:23 Zvend#249
Ugh didnt look for a longer time into autoit code. You should try out the ISN Autoit Editor.
It offers a good debugger and you dont have to ConsoleWrite() every line to find out where the error is, lol.

Link: [Only registered and activated users can see links. Click Here To Register...]

i can help you more if you tell me where it gets stuck.
02/10/2020 21:33 JohnyDee#250
No, I don't have any custom Initialize() func in my script that would call this (like the vaettir bot posted in the other thread). I just call the normal Initialize() func in a simple Eventhandler():

Code:
Func EventHandler()
	Switch (@GUI_CtrlId)
		Case $btnStart
			$boolRun = Not $boolRun
			If $boolRun Then
				GUICtrlSetData($btnStart, "Initializing...")
				GUICtrlSetState($btnStart, $GUI_DISABLE)
				Local $CharName = GUICtrlRead($Combo1)
				If $CharName = "" Then
					If Initialize(WinGetProcess("Guild Wars"), False, True, False) = False Then
						MsgBox(0, "Error", "Guild Wars it not running.")
						Exit
					EndIf
				  Else
					If Initialize($CharName, False, True, False) = False Then
						MsgBox(0, "Error", "Can't find a Guild Wars client with that character name.")
						Exit
					EndIf
				EndIf
				GUICtrlSetData($btnStart, "Stop")
				GUICtrlSetState($btnStart, $GUI_ENABLE)
			Else
				GUICtrlSetData($btnStart, "Continue")
			 EndIf
		Case $cbxHideGW
			If $mGWProcHandle <> 0 Then ToggleRendering()
		Case $GUI_EVENT_CLOSE
			If Not $Rendering Then ToggleRendering()
			Exit
	EndSwitch
EndFunc   ;==>EventHandler
I have also removed the togglerendering part as it is currently not functional. I have also tried the vaettir bot that I mentioned before (which is reported as working) and I get the same crash of gw client (again during the initialize). The bots don't crash and they don't present any issues (with missing globals or funcs etc), it is the actual game that crashes when GWA2 tries to inject itself. I am also using Windows 7 if that makes any difference (?). Thanks in advance for your input :)
02/11/2020 03:13 phat34#251
For windows 7 try to add this line at the top of the file.

Code:
#RequireAdmin
You also may have some compatibility issues...or an older autoit version...
02/11/2020 09:04 JohnyDee#252
Good point, I always run both gw and the script as admin just to avoid any such issues. I will check the autoit version, this could be it. I will also try running things in Win 10 (which I haven't done so far) in case it's the OS...


EDIT: It was the fucking outdated Autoit................
02/23/2020 20:39 JohnyDee#253
Anyone got an example of an Assassin kill() function? I am having some trouble with the lead/second/third attack sequencing and getting the correct targets there... The sequence is the common jagged strike, fox fangs, death blossom.

Here is what I got so far but not working properly:

Code:
Func KillSin()
	While GetNumberOfFoesInRangeOfAgent(-2, 1250) > 0
		Local $jsOK = False
		Local $ffOK = False
		If GetIsDead(-2) Then Return
		If CheckEnchantments() Then
			TargetNearestEnemy()
			PingSleep()
			ChangeTarget(-1)
			PingSleep()
			If IsRecharged($js) And $jsOK = False And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
				Do
					If GetIsDead(-2) Then Return
					UseSkillEx($js, -1)
					PingSleep()
				Until GetSkillBarSkillRecharge($js) <> 0 ; ensure first attack
				$jsOK = True
				If IsRecharged($ff) And $jsOK = True And $ffOK = False And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
					Do
						If GetIsDead(-2) Then Return
						UseSkillEx($ff, -1)
						PingSleep()
					Until GetSkillBarSkillRecharge($ff) <> 0 ; ensure second attack
					$ffOK = True
					$jsOK = False
					If IsRecharged($db) And $ffOK = True And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
						Do
							If GetIsDead(-2) Then Return
							UseSkillEx($db, -1)
							PingSleep()
						Until GetSkillBarSkillRecharge($db) <> 0 ; ensure third attack
						$ffOK = False
					EndIf
				EndIf
			ElseIf GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
				Attack(-1)
				PingSleep()
			EndIf
		EndIf
	WEnd
EndFunc
02/24/2020 18:03 sadusten#254
Quote:
Originally Posted by JohnyDee View Post
Anyone got an example of an Assassin kill() function? I am having some trouble with the lead/second/third attack sequencing and getting the correct targets there... The sequence is the common jagged strike, fox fangs, death blossom.

Here is what I got so far but not working properly:

Code:
Func KillSin()
	While GetNumberOfFoesInRangeOfAgent(-2, 1250) > 0
		Local $jsOK = False
		Local $ffOK = False
		If GetIsDead(-2) Then Return
		If CheckEnchantments() Then
			TargetNearestEnemy()
			PingSleep()
			ChangeTarget(-1)
			PingSleep()
			If IsRecharged($js) And $jsOK = False And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
				Do
					If GetIsDead(-2) Then Return
					UseSkillEx($js, -1)
					PingSleep()
				Until GetSkillBarSkillRecharge($js) <> 0 ; ensure first attack
				$jsOK = True
				If IsRecharged($ff) And $jsOK = True And $ffOK = False And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
					Do
						If GetIsDead(-2) Then Return
						UseSkillEx($ff, -1)
						PingSleep()
					Until GetSkillBarSkillRecharge($ff) <> 0 ; ensure second attack
					$ffOK = True
					$jsOK = False
					If IsRecharged($db) And $ffOK = True And GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
						Do
							If GetIsDead(-2) Then Return
							UseSkillEx($db, -1)
							PingSleep()
						Until GetSkillBarSkillRecharge($db) <> 0 ; ensure third attack
						$ffOK = False
					EndIf
				EndIf
			ElseIf GetAgentExists(-1) And DllStructGetData(GetAgentByID(-1), "HP") > 0 Then
				Attack(-1)
				PingSleep()
			EndIf
		EndIf
	WEnd
EndFunc
Try this one.

Code:
Func Killsin()
	Local $timerskills
	Local $ldistance

	While GetNumberOfFoesInRangeOfAgent(-2, 1250) > 0
		If GetIsDead(-2) Then ExitLoop
		If CheckEnchantments() Then
			TargetNearestEnemy()
			Sleep(getping() + 100)
			$ldistance = getdistance(-1, -2)
			If $ldistance > 100 Then             ;Moving up to foe
				attack(-1)
				Do
					Sleep(getping())
				Until $ldistance < 100
			EndIf
			Do
				If isrecharged($JS) Then
					If GetIsDead(-1) Then Return False
					$timerskills = TimerInit()
					useskill($JS, -1)
					Do
						Sleep(getping())
					Until Not isrecharged($JS) Or TimerDiff($timerskills) > 1250 Or GetIsDead(-1)
				EndIf
				If getisbleeding(-1) Then ;Making sure it hit him.
					If isrecharged($FF) Then
						If GetIsDead(-1) Then Return False
						$timerskills = TimerInit()
						useskill($FF, -1)
						Do
							Sleep(getping())
						Until Not isrecharged($FF) Or TimerDiff($timerskills) > 1250 Or GetIsDead(-1)
					EndIf
				EndIf
				If isrecharged($DB) Then
					If Not isrecharged($FF) Then ;Making sure FF has been used.
						If GetIsDead(-1) Then Return False
						$timerskills = TimerInit()
						useskill($DB, -1)
						Do
							Sleep(getping())
						Until Not isrecharged($DB) Or TimerDiff($timerskills) > 1250 Or GetIsDead(-1)
					EndIf
				EndIf
			Until GetIsDead(-1)
		EndIf
	WEnd
EndFunc   ;==>Killsin
02/26/2020 09:14 JohnyDee#255
Hi and thanks, it still does not work very well so I am trying different things. I also found this func from an old thread:

Code:
func canUseCombo($skill, $target)
	if not isDllStruct($target) then $target = getAgentByID($target)
	if not isDllStruct($skill) then $skill = getSkillById($skill)
	switch dllStructGetData($skill, "comboReq")
		case 1
			return dllStructGetData($target, "laststrike") = 3
		case 2
			return dllStructGetData($target, "laststrike") = 1
		case 4
			return dllStructGetData($target, "laststrike") = 2
	endSwitch
	return true
endFunc
but I am not exactly sure how it should be called in the fighting function...