package sig.modules; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinNT; import com.sun.jna.platform.win32.WinNT.HANDLE; import sig.Module; import sig.sigIRC; import sig.modules.RabiRibi.Entity; import sig.modules.RabiRibi.MemoryOffset; import sig.modules.RabiRibi.MemoryType; import sig.modules.RabiRibi.Overlay; import sig.modules.utils.PsapiTools; import sig.utils.DrawUtils; import sig.utils.FileUtils; import sig.utils.TextUtils; public class RabiRibiModule extends Module{ final int PROCESS_PERMISSIONS = WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ; boolean foundRabiRibi = false; int rabiRibiPID = -1; long rabiRibiMemOffset = 0; public HANDLE rabiribiProcess = null; HashMap entities = new HashMap(); final static int MAX_ENTITIES_TO_UPDATE = 500; final static int ENTITY_ARRAY_ELEMENT_SIZE = 0x704; public Overlay overlay; public RabiRibiModule(Rectangle2D bounds, String moduleName) { super(bounds, moduleName); //Initialize(); Initialize(); //System.out.println("Money value is: "+readIntFromMemory(MemoryOffset.MONEY)); } private void Initialize() { List pids; try { pids = PsapiTools.getInstance().enumProcesses(); for (Integer pid : pids) { HANDLE process = Kernel32.INSTANCE.OpenProcess(PROCESS_PERMISSIONS, true, pid); List hModules; try { hModules = PsapiTools.getInstance().EnumProcessModules(process); for(sig.modules.utils.Module m: hModules){ //System.out.println(m.getFileName()+":"+m.getEntryPoint()); if (m.getFileName().contains("rabiribi")) { rabiRibiMemOffset = Pointer.nativeValue(m.getLpBaseOfDll().getPointer()); System.out.println("Found an instance of Rabi-Ribi at 0x"+Long.toHexString(rabiRibiMemOffset)); rabiRibiPID=pid; foundRabiRibi=true; rabiribiProcess=process; break; } } } catch (Exception e) { e.printStackTrace(); } if (foundRabiRibi) { break; } if (process!=null) { Kernel32.INSTANCE.CloseHandle(process); } } } catch (Exception e) { e.printStackTrace(); } this.overlay = new Overlay(this); } public void ApplyConfigWindowProperties() { sigIRC.rabiribimodule_X=(int)position.getX(); sigIRC.rabiribimodule_Y=(int)position.getY(); sigIRC.config.setInteger("RABIRIBI_module_X", sigIRC.rabiribimodule_X); sigIRC.config.setInteger("RABIRIBI_module_Y", sigIRC.rabiribimodule_Y); } public void run() { super.run(); updateEntities(); overlay.run(); } public HashMap getEntities() { return entities; } private void updateEntities() { //System.out.println("Size is "+size); List idsToRemove = new ArrayList(); for (Integer i : entities.keySet()) { Entity ent = entities.get(i); if (!ent.run()) { idsToRemove.add(i); } } for (Integer i : idsToRemove) { if (!overlay.objects.remove(entities.get(i).marker)) { System.out.println("WARNING! Could not remove overlay EntityMarker. Possible memory leak occurring!"); } entities.remove(i); } //System.out.println("Starting address is 0x"+Long.toHexString(readIntFromMemory(MemoryOffset.ENTITY_ARRAY))); long arrayPtr = readIntFromMemory(MemoryOffset.ENTITY_ARRAY); //System.out.println("Array Pointer starts at 0x"+Long.toHexString(arrayPtr)); for (int i=0;i0.5f) { g.setColor(Color.RED); } DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, g.getColor(), Color.WHITE, "XSPD "+readFloatFromErinaData(MemoryOffset.ERINA_XSPEED)); g.setColor(Color.BLACK); /*DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "Sunny Beam: "+Arrays.toString( new int[]{ readIntFromMemory(0xD63304), readIntFromMemory(0xD63D0C), })); */ /* for (String s : TextUtils.WrapText(("Entities: "+entities).replaceAll(",", ", "), sigIRC.panel.programFont, position.getWidth()-20)) { DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX()+20, position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, s); }*/ for (Integer numb : entities.keySet()) { Entity ent = entities.get(numb); if (ent.getLastHitTime()>readIntFromMemory(MemoryOffset.PLAYTIME)-180) { for (String s : TextUtils.WrapText("Entity "+ent.getID()+": "+ent.getHealth()+"/"+ent.getMaxHealth()+" HP "+((ent.getHealth()/(float)ent.getMaxHealth())*100)+"%".replaceAll(",", ", "), sigIRC.panel.programFont, position.getWidth()-20)) { DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX()+20, position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, s); } } } } } public void keypressed(KeyEvent ev) { super.keypressed(ev); /*if (ev.getKeyCode()==KeyEvent.VK_HOME) { String memFile = sigIRC.BASEDIR+"memoryDump.txt"; FileUtils.logToFile("Memory Dump of All Loaded Entities:", memFile); for (Integer numb : entities.keySet()) { Entity ent = entities.get(numb); FileUtils.logToFile(ent.toString(), memFile); for (int i=0;i