As for finding monsters only by using memory reading(cheat engine) and not packets:
By selecting monster you can get his unique id, next is searching memory for this value. There are few results and usually one of the latest is adress of id conected to structure describing that monster. It's quite well visible by browsing the memory region of id adress. There is id, is he alive or dead at the moment, his x and y values on the map and something more. This data isn't stored as an array for all the monsters on the map, rather as single objects probably conected into array somewhere else (if anyone have seen that array of all monsters on the map I'd be very grateful for the info

).
Unfortunately I haven't been able to localize base adress of any of those fields - always ending in black alley. And those structures are allocated dynamically during the game, even if you don't leave the map, which makes it even harder to obtain.
Just saying that there is this data in ram - maybe someone can get to it's base adress.
I haven't been using this bot but one (maybe unnecessary) question: are base adresses and offsets hard coded to the application?
If yes, maybe it would be good idea to read them from external file on start - no need to change the program if some adresses change and one program for any client version (only different adress files)