:D
Okie Guys!
Here they are! AutoIt scripts for:
Global Variables
GatherItem function OpCode
CasSkill function OpCode
Auto Path function OpCode
MoveTo function OpCode
Auto Path function OpCode
MoveTo Function OpCode
Inject OpCodes
Hex Converter
And lastly the Address Retriever (BTW this code is compiled into exe using Win 7 32-bit OS)
And to others who are pm-ing me, please stop it, it tickles...
Everything you wanted to know is already here.
Breast feeding are for babies!
Spoon feeding are for those who could not use spoon.
Thanks to Remmm and his resources, because of him I learned how to trace and make the CastSkill Function
And your welcum too guys! :cool:
Okie Guys!
Here they are! AutoIt scripts for:
Global Variables
Code:
Global $GAME_TITLE = "Perfect World" Global $GAME_PID = WinGetProcess($GAME_TITLE) Global $GAME_PROCESS = _MemoryOpen($GAME_PID) Global $ADDRESS_BASE = 0xD22C74 Global $ADDRESS_SENDPACKET = 0x782FD0 Global $ADDRESS_AUTOPATH = 0x455940 Global $ADDRESS_ACTION1 = 0x49FF80 Global $ADDRESS_ACTION2 = 0x4A6320 Global $ADDRESS_ACTION3 = 0x4A0590 Global $ADDRESS_GATHER = 0x495C40 Global $ADDRESS_CASTSKILL = 0x48DF40
GatherItem function OpCode
Code:
Func GatherItem($ITEM_UNIQUE_ID, $ACTION_TYPE=0) $ADDRESS_GATHER = 0x495C40 ;Construct the OpCode for calling the 'GatherItem' function $OPcode = "60" ;60 PUSHAD $OPcode &= "B9" & _Hex($ADDRESS_BASE) ;B8 00000000 MOV ECX,#Baseadr $OPcode &= "8B09" ;8B009 MOV ECX,DWORD PTR DS:[ECX] $OPcode &= "8B491C" ;8B49 1C MOV ECX,DWORD PTR DS:[ECX+1C] $OPcode &= "8B4928" ;8B49 28 MOV ECX,DWORD PTR DS:[ECX+28] $OPcode &= "68" & _Hex($ACTION_TYPE) ;68 00000000 PUSH $ACTION_TYPE 0=Pick 1=Dig $OPcode &= "68" & _Hex($ITEM_UNIQUE_ID) ;68 00000000 PUSH $ITEM_UNIQUE_ID $OPcode &= "BB" & _Hex($ADDRESS_GATHER) ;BB 00000000 MOV EBX, $ADDRESS_GATHER $OPcode &= "FFD3" ;FFD3 CALL EBX $OPcode &= "61" ;61 POPAD $OPcode &= "C3" ;C3 RETN InjectCode($OPcode) EndFunc
CasSkill function OpCode
Code:
Func CastSKILL($SKILL_POINTER, $SKILL_ID) ;Declare local variables $ADDRESS_CASTSKILL = 0x48DF40 ;Construct the OpCode for calling the 'CastSKILL' function $OPcode = "60" ;60 PUSHAD $OPcode &= "B8" & _Hex($ADDRESS_BASE) ;B8 00000000 MOV EAX,#Baseadr $OPcode &= "8B00" ;8B00 MOV EAX,DWORD PTR DS:[EAX] $OPcode &= "8B401C" ;8B40 1C MOV EAX,DWORD PTR DS:[EAX+1C] $OPcode &= "8B7028" ;8B70 28 MOV ESI,DWORD PTR DS:[EAX+28] $OPcode &= "B8" & _Hex($SKILL_POINTER) ;B8 00000000 MOV EAX, $SKILL POINTER $OPcode &= "6AFF" ;6A FF PUSH -1 $OPcode &= "6A00" ;6A 00 PUSH 0 $OPcode &= "6A00" ;6A 00 PUSH 0 $OPcode &= "B9" & _Hex($SKILL_ID) ;B9 00000000 MOV ECX, $SKILL ID $OPcode &= "51" ;51 PUSH ECX $OPcode &= "8BCE" ;8BCE MOV ECX,ESI $OPcode &= "BA" & _Hex($ADDRESS_CASTSKILL) ;BA 00000000 MOV EDX, $ADDRESS_CASTSKILL $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "61" ;61 POPAD $OPcode &= "C3" ;C3 RETN InjectCode($OPcode) EndFunc
Auto Path function OpCode
Code:
Func AutoPath($DEST_X, $DEST_Y, $ALT=0, $DISMOUNT=0)
;Construct the OpCode for calling the 'AutoPath' function
$OPcode = '60' ;60 PUSHAD
$OPcode &= 'B9' & _Hex($DEST_Y, 8, 'float') ;B9 00000000 MOV ECX, Y-FLOAT
$OPcode &= 'BA' & _Hex($ALT) ;BA 00000000 MOV EDX, Z-INT
$OPcode &= 'B8' & _Hex($DEST_X, 8, 'float') ;B8 00000000 MOV EAX, X-FLOAT
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '51' ;51 PUSH ECX
$OPcode &= '52' ;52 PUSH EDX
$OPcode &= '50' ;50 PUSH EAX
$OPcode &= '6A03' ;6A 03 PUSH 3
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '684A010000' ;68 14A0 PUSH 0X14A
$OPcode &= 'B9'&_Hex($ADDRESS_BASE) ;B9 00000000 MOV ECX, BASE_ADDRESS
$OPcode &= '8B09' ;8B09 MOV ECX, DWORD PTR DS:[ECX]
$OPcode &= '83C11C' ;83C1 1C ADD ECX, 1C
$OPcode &= '8B09' ;8B09 MOV ECX, DWORD PTR DS:[ECX]
$OPcode &= 'BB'&_Hex($ADDRESS_AUTOPATH) ;BB 00000000 MOV EBX, AUTOPATH_ADDRESS
$OPcode &= 'FFD3' ;FFD3 CALL EBX
$OPcode &= 'B9' & _Hex($ALT) ;B9 00000000 MOV ECX, Z-INT
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '6A' & _Hex($DISMOUNT, 2) ;6A 00 PUSH FLAG-DISMOUNT AT DESTINATION
$OPcode &= '51' ;51 PUSH ECX
$OPcode &= '6A01' ;6A 00 PUSH 1
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '6A00' ;6A 00 PUSH 0
$OPcode &= '684A010000' ;68 14A0 PUSH 0X14A
$OPcode &= 'B9'&_Hex($ADDRESS_BASE) ;B9 00000000 MOV ECX, BASE_ADDRESS
$OPcode &= '8B09' ;8B09 MOV ECX, DWORD PTR DS:[ECX]
$OPcode &= '83C11C' ;83C1 1C ADD ECX, 1C
$OPcode &= '8B09' ;8B09 MOV ECX, DWORD PTR DS:[ECX]
$OPcode &= 'BB'&_Hex($ADDRESS_AUTOPATH) ;BB 00000000 MOV EBX, AUTOPATH_ADDRESS
$OPcode &= 'FFD3' ;FFD3 CALL EBX
$OPcode &= '61' ;61 POPAD
$OPcode &= 'C3' ;C3 RET
InjectCode($OPcode)
EndFunc
MoveTo function OpCode
Code:
Func MoveTo($DEST_X, $DEST_Y, $DEST_Z, $VERTICAL=0) ;Construct the OpCode for calling the 'MoveTo' function $OPcode = "60" ;60 PUSHAD $OPcode &= "B8" & _Hex($ADDRESS_BASE) ;B8 00000000 MOV EAX,#Baseadr $OPcode &= "8B00" ;8B00 MOV EAX,DWORD PTR DS:[EAX] $OPcode &= "8B401C" ;8B40 1C MOV EAX,DWORD PTR DS:[EAX+1C] $OPcode &= "8B7028" ;8B70 28 MOV ESI,DWORD PTR DS:[EAX+28] $OPcode &= "8B8E" & _Hex($OFFSET_ACTIONBASE);8B8E 11111111 MOV ECX,DWORD PTR DS:[ESI+ActArr] $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "BA" & _Hex($ADDRESS_ACTION1) ;BA 00000000 MOV EDX,Walk1 $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "8BF8" ;8BF8 MOV EDI,EAX $OPcode &= "8D442418" ;8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18] $OPcode &= "50" ;50 PUSH EAX $OPcode &= "BA" & _Hex($VERTICAL) ;BA 00000000 MOV EDX, fly mode $OPcode &= "52" ;52 PUSH EDX $OPcode &= "8BCF" ;8BCF MOV ECX,EDI $OPcode &= "BA" & _Hex($ADDRESS_ACTION2) ;BA 00000000 MOV EDX,Walk2 $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "8B8E" & _Hex($OFFSET_ACTIONBASE);8B8E 22222222 MOV ECX,DWORD PTR DS:[ESI+ActArr] $OPcode &= "B8" & _Hex($DEST_X, 8, 'float') ;B8 00000000 MOV EAX,x $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C220" ;83C2 20 ADD EDX,20 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "B8" & _Hex($DEST_Z, 8, 'float') ;B8 00000000 MOV EAX,z $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C224" ;83C2 24 ADD EDX,24 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "B8" & _Hex($DEST_Y, 8, 'float') ;B8 00000000 MOV EAX,y $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C228" ;83C2 28 ADD EDX,28 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "6A00" ;6A 00 PUSH 0 $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "57" ;57 PUSH EDI $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "BA" & _Hex($ADDRESS_ACTION3) ;BA 00000000 MOV EDX,Walk3 $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "61" ;61 POPAD $OPcode &= "C3" ;C3 RETN InjectCode($OPcode) EndFunc
Auto Path function OpCode
Code:
Func AutoPathInt($DEST_X, $DEST_Y, $DEST_Z=0, $DISMOUNT=0) ;Declare local variables If $DEST_Z = 0 Then $DEST_Z = $CHAR_Z/10 ;Construct the OpCode for calling the 'AutoPath' function $OPcode = '60' $OPcode &= 'B9' & _Hex($DEST_Y*10-5500, 8, 'float') $OPcode &= 'BA' & _Hex($DEST_Z) $OPcode &= 'B8' & _Hex($DEST_X*10-4000, 8, 'float') $OPcode &= '6A00' $OPcode &= '51' $OPcode &= '52' $OPcode &= '50' $OPcode &= '6A03' $OPcode &= '6A00' $OPcode &= '6A00' $OPcode &= '684A010000' $OPcode &= 'B9'&_Hex($ADDRESS_BASE) $OPcode &= '8B09' $OPcode &= '83C11C' $OPcode &= '8B09' $OPcode &= 'BB'&_Hex($ADDRESS_AUTOPATH) $OPcode &= 'FFD3' $OPcode &= 'B9' & _Hex($DEST_Z) $OPcode &= '6A00' $OPcode &= '6A00' $OPcode &= '6A' & _Hex($DISMOUNT, 2, 'int') $OPcode &= '51' $OPcode &= '6A01' $OPcode &= '6A00' $OPcode &= '6A00' $OPcode &= '684A010000' $OPcode &= 'B9'&_Hex($ADDRESS_BASE) $OPcode &= '8B09' $OPcode &= '83C11C' $OPcode &= '8B09' $OPcode &= 'BB'&_Hex($ADDRESS_AUTOPATH) $OPcode &= 'FFD3' $OPcode &= '61' $OPcode &= 'C3' InjectCode($OPcode) EndFunc
MoveTo Function OpCode
Code:
Func MoveToInt($DEST_X, $DEST_Y, $DEST_Z, $VERTICAL=0) ;Construct the OpCode for calling the 'MoveTo' function $OPcode = "60" ;60 PUSHAD $OPcode &= "B8" & _Hex($ADDRESS_BASE) ;B8 00000000 MOV EAX,#Baseadr $OPcode &= "8B00" ;8B00 MOV EAX,DWORD PTR DS:[EAX] $OPcode &= "8B401C" ;8B40 1C MOV EAX,DWORD PTR DS:[EAX+1C] $OPcode &= "8B7028" ;8B70 28 MOV ESI,DWORD PTR DS:[EAX+28] $OPcode &= "8B8E" & _Hex($OFFSET_ACTIONBASE);8B8E 11111111 MOV ECX,DWORD PTR DS:[ESI+ActArr] $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "BA" & _Hex($ADDRESS_ACTION1) ;BA 00000000 MOV EDX, StartAction $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "8BF8" ;8BF8 MOV EDI,EAX $OPcode &= "8D442418" ;8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18] $OPcode &= "50" ;50 PUSH EAX $OPcode &= "BA" & _Hex($VERTICAL) ;BA 00000000 MOV EDX, fly mode $OPcode &= "52" ;52 PUSH EDX $OPcode &= "8BCF" ;8BCF MOV ECX,EDI $OPcode &= "BA" & _Hex($ADDRESS_ACTION2) ;BA 00000000 MOV EDX, PerformAction $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "8B8E" & _Hex($OFFSET_ACTIONBASE);8B8E 22222222 MOV ECX,DWORD PTR DS:[ESI+ActArr] $OPcode &= "B8" & _Hex($DEST_X*10-4000, 8, 'float') ;B8 00000000 MOV EAX,x $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C220" ;83C2 20 ADD EDX,20 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "B8" & _Hex($DEST_Z*10, 8, 'float') ;B8 00000000 MOV EAX,z $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C224" ;83C2 24 ADD EDX,24 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "B8" & _Hex($DEST_Y*10-5500, 8, 'float') ;B8 00000000 MOV EAX,y $OPcode &= "8BD7" ;8BD7 MOV EDX,EDI $OPcode &= "83C228" ;83C2 28 ADD EDX,28 $OPcode &= "8902" ;8902 MOV DWORD PTR DS:[EDX],EAX $OPcode &= "6A00" ;6A 00 PUSH 0 $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "57" ;57 PUSH EDI $OPcode &= "6A01" ;6A 01 PUSH 1 $OPcode &= "BA" & _Hex($ADDRESS_ACTION3) ;BA 00000000 MOV EDX, FinishAction $OPcode &= "FFD2" ;FFD2 CALL EDX $OPcode &= "61" ;61 POPAD $OPcode &= "C3" ;C3 RETN InjectCode($OPcode) EndFunc
Inject OpCodes
Code:
Func InjectCode($OPcode)
;Declare local variables
;Open process for given processId
$processHandle = $GAME_PROCESS[1]
;Allocate memory for the OpCode and retrieve address for this
$functionAddress = DllCall('kernel32.dll', 'int', 'VirtualAllocEx', 'int', $processHandle, 'ptr', 0, 'int', 100, 'int', 0x1000, 'int', 0x40)
;Construct the OpCode for calling the function
;Put the OpCode into a struct for later memory writing
$vBuffer = DllStructCreate('byte[' & StringLen($OPcode) / 2 & ']')
For $loop = 1 To DllStructGetSize($vBuffer)
DllStructSetData($vBuffer, 1, Dec(StringMid($OPcode, ($loop - 1) * 2 + 1, 2)), $loop)
Next
;Write the OpCode to previously allocated memory
DllCall('kernel32.dll', 'int', 'WriteProcessMemory', 'int', $processHandle, 'int', $functionAddress[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
;Create a remote thread in order to run the OpCode
$hRemoteThread = DllCall('kernel32.dll', 'int', 'CreateRemoteThread', 'int', $processHandle, 'int', 0, 'int', 0, 'int', $functionAddress[0], 'ptr', 0, 'int', 0, 'int', 0)
;Wait for the remote thread to finish
Do
$result = DllCall('kernel32.dll', 'int', 'WaitForSingleObject', 'int', $hRemoteThread[0], 'int', 50)
Until $result[0] <> 258
;Close the handle to the previously created remote thread
DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $hRemoteThread[0])
;Free the previously allocated memory
DllCall('kernel32.dll', 'ptr', 'VirtualFreeEx', 'hwnd', $processHandle, 'int', $functionAddress[0], 'int', 0, 'int', 0x8000)
Return True
EndFunc
Hex Converter
Code:
Func _Hex($Value, $size=8, $type="int")
Local $tmp1, $tmp2, $i
If($type = "int") Then
$tmp1 = StringRight("000000000" & Hex($Value), $size)
ElseIf($type = "float") Then
$tmp1 = StringRight("000000000" & _FloatToHex($Value), $size)
EndIf
For $i = 0 To StringLen($tmp1) / 2 - 1
$tmp2 = $tmp2 & StringMid($tmp1, StringLen($tmp1) - 1 - 2 * $i, 2)
Next
Return $tmp2
EndFunc
Func _FloatToHex($floatval)
$sF = DllStructCreate("float")
$sB = DllStructCreate("ptr", DllStructGetPtr($sF))
If $floatval = "" Then Exit
DllStructSetData($sF, 1, $floatval)
$return=DllStructGetData($sB, 1)
Return $return
EndFunc
And lastly the Address Retriever (BTW this code is compiled into exe using Win 7 32-bit OS)
Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 1)
GUICreate("PWI Essential Addresses", 400, 400)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$OUTPUT_ADDRESS = GUICtrlCreateEdit("", 10, 10, 380, 330, BitAND($ES_AUTOHSCROLL, $ES_AUTOVSCROLL, $ES_MULTILINE))
GUICtrlCreateLabel("Game Client: ", 5, 350)
$DEFAULT_FOLDER = @ProgramFilesDir & "\Arc\PWI_En\element\"
$DEFAULT_CLIENT = "elementclient.exe"
$INPUT_GAME = GUICtrlCreateInput($DEFAULT_FOLDER & $DEFAULT_CLIENT, 100, 350, 290, 18)
GUICtrlCreateButton("Browse", 100, 370, 50, 25)
GUICtrlSetOnEvent(-1, "GetClientExe")
GUICtrlCreateButton("Retrieve", 160, 370, 50, 25)
GUICtrlSetOnEvent(-1, "RetrieveAddress")
GUISetState()
While 1
Sleep(100)
WEnd
Func GetClientExe()
$EXE = FileOpenDialog("Perfect World Client", $DEFAULT_FOLDER, "Executable (*.exe)", 1, $DEFAULT_CLIENT)
GUICtrlSetData($INPUT_GAME, $EXE)
EndFunc
Func RetrieveAddress()
$EXE = GUICtrlRead($INPUT_GAME)
If @error Then Return
$FILE = FileOpen($EXE, 16)
$DATA = FileRead($FILE, FileGetSize($EXE))
FileClose($FILE)
$OPCODEBASE = 'A1(.{8})5332DB8B48.{2}'
$BASE = StringRegExp($DATA, $OPCODEBASE, 1)
$OPCODEPACKET = '6AFF68.{8}64A100000000506489250000000083EC185356578BF96A07'
$PACKET = StringRegExp($DATA, $OPCODEPACKET, 1)
$OPCODEAUTOPATH = '6AFF68.{8}64A100000000506489250000000083EC2053568BF18D4C2408E8.{8}8B4C243C8B542440'
$AUTOPATH = StringRegExp($DATA, $OPCODEAUTOPATH, 1)
$OPCODE_ACTION1 = '64A1.{8}6AFF68.{8}508B442410648925.{8}5683F8138BF1'
$ACTION1 = StringRegExp($DATA, $OPCODE_ACTION1, 1)
$OPCODE_ACTION2 = '83EC2453558B6C243056578B7C243C8BF133DB896E2C8B07894620'
$ACTION2 = StringRegExp($DATA, $OPCODE_ACTION2, 1)
$OPCODE_ACTION3 = '5355568B74241485F6578BD975095F5E5D32C05BC20C00'
$ACTION3 = StringRegExp($DATA, $OPCODE_ACTION3, 1)
$OPCODE_GATHER = '5355578BF98B87.{8}C1E807A8010F85.{8}E8.{8}84C00F85.{8}8B6C2410'
$GATHER = StringRegExp($DATA, $OPCODE_GATHER, 1)
$OPCODE_CAST = '535556578BF16A04E8.{8}8B8E.{8}83C40485C974076A02'
$CAST = StringRegExp($DATA, $OPCODE_CAST, 1)
If @error Then
MsgBox(0, "Issues Attaching For Offsets", "There may be another bot attached to this process. Please close that bot and try again")
Return
EndIf
$ADDRESS_BASE = '0x' & Rev($BASE[0])
$ADDRESS_SENDPACKET = '0x' & Hex(StringInStr($DATA, $PACKET[0])/2 + 0x400000 - 1)
$ADDRESS_AUTOPATH = '0x' & Hex(StringInStr($DATA, $AUTOPATH[0])/2 + 0x400000 - 1)
$ADDRESS_ACTION1 = '0x' & Hex(StringInStr($DATA, $ACTION1[0])/2 + 0x400000 - 1)
$ADDRESS_ACTION2 = '0x' & Hex(StringInStr($DATA, $ACTION2[0])/2 + 0x400000 - 1)
$ADDRESS_ACTION3 = '0x' & Hex(StringInStr($DATA, $ACTION3[0])/2 + 0x400000 - 1)
$ADDRESS_GATHER = '0x' & Hex(StringInStr($DATA, $GATHER[0])/2 + 0x400000 - 1)
$ADDRESS_CAST = '0x' & Hex(StringInStr($DATA, $CAST[0])/2 + 0x400000 - 1)
$OUTPUT = ""
$OUTPUT &= "Global $ADDRESS_BASE="
$OUTPUT &= $ADDRESS_BASE
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_SENDPACKET="
$OUTPUT &= $ADDRESS_SENDPACKET
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_AUTOPATH="
$OUTPUT &= $ADDRESS_AUTOPATH
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_ACTION1="
$OUTPUT &= $ADDRESS_ACTION1
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_ACTION2="
$OUTPUT &= $ADDRESS_ACTION2
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_ACTION3="
$OUTPUT &= $ADDRESS_ACTION3
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_GATHER="
$OUTPUT &= $ADDRESS_GATHER
$OUTPUT &= @CRLF
$OUTPUT &= "Global $ADDRESS_CAST="
$OUTPUT &= $ADDRESS_CAST
$OUTPUT &= @CRLF
GUICtrlSetData($OUTPUT_ADDRESS, $OUTPUT)
EndFunc
Func Rev($string)
Local $all
For $i = StringLen($string) + 1 To 1 Step -2
$all = $all & StringMid($string, $i, 2)
Next
Return $all
EndFunc
Func _Exit()
Exit
EndFunc
And to others who are pm-ing me, please stop it, it tickles...
Everything you wanted to know is already here.
Breast feeding are for babies!
Spoon feeding are for those who could not use spoon.
Thanks to Remmm and his resources, because of him I learned how to trace and make the CastSkill Function
And your welcum too guys! :cool: