Orignally posted by ChrissDeGreeece

here is our code:-

#RequireAdmin
#include "NomadMemory.au3";
#Include <String.au3>
#Include <Timers.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#Include <Date.au3>

$formGMShouts = GUICreate("GM Shouts - made by ChrissDeGrece @2010", 592, 456, 193, 129)
$Group1 = GUICtrlCreateGroup("Messagelist", 8, 8, 465, 273)
$msgList = GUICtrlCreateList("", 16, 24, 441, 240, BitOR($LBS_NOTIFY,$WS_VSCROLL,$WS_BORDER))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bReload = GUICtrlCreateButton("Reload", 496, 16, 75, 25)
$StatusBar = _GUICtrlStatusBar_Create($formGMShouts)
Dim $StatusBar_PartsWidth[2] = [250, -1]
_GUICtrlStatusBar_SetParts($StatusBar, $StatusBar_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar, "Messages will change every 60 seconds", 0)
_GUICtrlStatusBar_SetText($StatusBar, @TAB & @TAB & "GMShouts made by ChrissDeGrece @2010       ", 1)
$bStart = GUICtrlCreateButton("Start", 496, 48, 75, 25)
$bStop = GUICtrlCreateButton("Stop", 496, 80, 75, 25)
$Group2 = GUICtrlCreateGroup("Errors", 8, 304, 465, 113)
$lbErrors = GUICtrlCreateList("", 16, 320, 449, 84)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

$test = SetPrivilege("SeDebugPrivilege", 1)
$oops = 0
$curdate = _NowCalcDate()

$started = 0	
$messages = 0 
$msgcounter = 0
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $bReload
			$reply = MsgBox(4,"Reload?","Reload from messages file?")
			If $reply = 6 Then 
				ReadMsgFile()
			Else
				MsgBox(0,'OOOPS!','Not reloading!')
			EndIf
		Case $bStart
			$reply = MsgBox(4,"Start GM Shouts?","Start sending messages to ZoneServer?")
			If $reply = 6 Then 
				_GUICtrlStatusBar_SetText($StatusBar, "(Started) Messages will change every 60 seconds", 0)
				StartTimer()
			EndIf
		Case $bStop
			$reply = MsgBox(4,"Stop GM Shouts?","Stop sending messages to ZoneServer?")
			If $reply = 6 Then 
				_GUICtrlStatusBar_SetText($StatusBar, "(Stopped) Messages will change every 60 seconds", 0)
				StopTimer()
			EndIf
	EndSwitch
WEnd

Func SendToZS($msg)
	
	$Prog_ID=WinGetProcess("[CLASS:ZoneServer]")

	$Address= 0x00F9C804  ;Address holding the message

	$result = _MemoryOpen($Prog_ID)

	$Game_Memory=_MemoryGetBaseAddress($result,1)

	if @error > 0 Then
		MsgBox(0,"Error getting zoneserver base address, !",@error)
		StopTimer()
	EndIf

	;$welcome_string = _MemoryRead(0x00F9C804,$result,'char[47]')

	$newstring = $msg & _StringRepeat(" ", 45 - StringLen($msg))

	$res = _MemoryWrite(0x00F9C804,$result,$newstring,'char[47]')

	_MemoryClose($result)
	
EndFunc


Func UpdateMsg()
	
	

		If $msgcounter < $messages Then
			;_GUICtrlStatusBar_SetText($StatusBar, _GUICtrlListBox_GetText($msgList, $msgcounter) & $msgcounter, 0)
			;_GUICtrlListBox_AddString($msgList, _GUICtrlListBox_GetText($msgList, $msgcounter))
			SendToZS(_GUICtrlListBox_GetText($msgList, $msgcounter))
			$msgcounter = $msgcounter + 1
		Else
			$msgcounter = 0
			;_GUICtrlStatusBar_SetText($StatusBar, _GUICtrlListBox_GetText($msgList, $msgcounter) & $msgcounter, 0)
			;_GUICtrlListBox_AddString($msgList, _GUICtrlListBox_GetText($msgList, $msgcounter))
			SendToZS(_GUICtrlListBox_GetText($msgList, $msgcounter))
			$msgcounter = $msgcounter + 1
		EndIf
	
	
EndFunc

Func StopTimer()
	AdlibUnRegister("UpdateMsg")
EndFunc

Func StartTimer()
	if $messages = 0 then ReadMsgFile()
	AdlibRegister ( "UpdateMsg" , 60000 )
EndFunc

Func ReadMsgFile()
	$messages = 0
	$file = FileOpen("messages.txt", 0)

	; Check if file opened for reading OK
	If $file = -1 Then
		MsgBox(0, "Error", "Unable to open file.")
		Exit
	EndIf

	; Read in lines of text until the EOF is reached
	While 1
		$line = FileReadLine($file)
		If @error = -1 Then ExitLoop
		
		If StringLen($line) <= 45 Then
			_GUICtrlListBox_AddString($msgList, $line)
			$messages = $messages + 1
		Else
			MsgBox(0,"Ooops!","Line : " & $line & " exceeds allowed size of 45")
		EndIf
			

	Wend

	FileClose($file)
EndFunc


;===================================================================================================
; Function........:  _MemoryGetBaseAddress($ah_Handle, $iHD)
;
; Description.....:  Reads the 'Allocation Base' from the open process.
;
; Parameter(s)....:  $ah_Handle - An array containing the Dll handle and the handle of the open
;                                 process as returned by _MemoryOpen().
;                    $iHD - Return type:
;                       |0 = Hex (Default)
;                       |1 = Dec
;
; Requirement(s)..:  A valid process ID.
;
; Return Value(s).:  On Success - Returns the 'allocation Base' address and sets @Error to 0.
;                    On Failure - Returns 0 and sets @Error to:
;                       |1 = Invalid $ah_Handle.
;                       |2 = Failed to find correct allocation address.
;                       |3 = Failed to read from the specified process.
;
; Author(s).......:  Nomad. Szhlopp.
; URL.............:  http://www.autoitscript.com/forum/index.php?showtopic=78834
; Note(s).........:  Go to Www.CheatEngine.org for the latest version of CheatEngine.
;===================================================================================================
Func _MemoryGetBaseAddress($ah_Handle, $iHexDec = 0)
    
    Local $iv_Address = 0x01000000
    Local $v_Buffer = DllStructCreate('dword;dword;dword;dword;dword;dword;dword')
    Local $vData
    Local $vType
    
    If Not IsArray($ah_Handle) Then
        SetError(1)
        Return 0
    EndIf
    

    DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))
    
    If Not @Error Then
        
        $vData = Hex(DllStructGetData($v_Buffer, 2))
        $vType = Hex(DllStructGetData($v_Buffer, 3))
        
        While $vType <> "00000080"
            DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))
            $vData = Hex(DllStructGetData($v_Buffer, 2))
            $vType = Hex(DllStructGetData($v_Buffer, 3))
            If Hex($iv_Address) = "90000000" Then ExitLoop
            $iv_Address += 65536
            
        WEnd

        If $vType = "00000080" Then
            SetError(0)
            If $iHexDec = 1 Then
                Return Dec($vData)
            Else
                Return $vData
            EndIf
            
        Else
            SetError(2)
            Return 0
        EndIf
        
    Else
        SetError(3)
        Return 0
    EndIf
    
EndFunc

Attached is compiled script & messages.txt

chk this post for more info

http://forum.ragezone.com/f487/gm-shouts-732755/

credits:-ChrissDeGreece

Community content is available under CC-BY-SA unless otherwise noted.