Memory Values can now be obtained from Rabi-Ribi.

master
sigonasr2 7 years ago
parent 7ad939bbe0
commit 939e96ab6c
  1. BIN
      RabiTracker/RabiTracker.jar
  2. 111
      RabiTracker/memoryData
  3. 79
      RabiTracker/src/RabiTracker/MemoryData.java
  4. 88
      RabiTracker/src/RabiTracker/MemoryManager.java
  5. 17
      RabiTracker/src/RabiTracker/MemoryType.java
  6. 6
      RabiTracker/src/RabiTracker/Window.java
  7. 55
      RabiTracker/src/sig/utils/DebugUtils.java
  8. 189
      RabiTracker/src/sig/utils/FileUtils.java

Binary file not shown.

@ -0,0 +1,111 @@
MONEY:1.851;True;1.881;True;1.90;True
PLAYTIME:1.851;True;1.881;True;1.90;True
HEALTHUP_START:1.851;True;1.881;True;1.90;True
HEALTHUP_END:1.851;True;1.881;True;1.90;True
ATTACKUP_START:1.851;True;1.881;True;1.90;True
ATTACKUP_END:1.851;True;1.881;True;1.90;True
MANAUP_START:1.851;True;1.881;True;1.90;True
MANAUP_END:1.851;True;1.881;True;1.90;True
REGENUP_START:1.851;True;1.881;True;1.90;True
REGENUP_END:1.851;True;1.881;True;1.90;True
PACKUP_START:1.851;True;1.881;True;1.90;True
PACKUP_END:1.851;True;1.881;True;1.90;True
GAME_DIFFICULTY:1.851;True;1.881;True;1.90;True
GAME_LOOP:1.851;True;1.881;True;1.90;True
HAMMER:1.851;True;1.881;True;1.90;True
AIR_JUMP:1.851;True;1.881;True;1.90;True
SLIDING_POWDER:1.851;True;1.881;True;1.90;True
CARROT_BOMB:1.851;True;1.881;True;1.90;True
HOURGLASS:1.851;True;1.881;True;1.90;True
SPEED_BOOST:1.851;True;1.881;True;1.90;True
AUTO_EARRINGS:1.851;True;1.881;True;1.90;True
RIBBON:1.851;True;1.881;True;1.90;True
SOUL_HEART:1.851;True;1.881;True;1.90;True
RABI_SLIPPERS:1.851;True;1.881;True;1.90;True
BUNNY_WHIRL:1.851;True;1.881;True;1.90;True
QUICK_BARETTE:1.851;True;1.881;True;1.90;True
BOOK_OF_CARROT:1.851;True;1.881;True;1.90;True
CHAOS_ROD:1.851;True;1.881;True;1.90;True
HAMMER_WAVE:1.851;True;1.881;True;1.90;True
HAMMER_ROLL:1.851;True;1.881;True;1.90;True
LIGHT_ORB:1.851;True;1.881;True;1.90;True
WATER_ORB:1.851;True;1.881;True;1.90;True
FIRE_ORB:1.851;True;1.881;True;1.90;True
NATURE_ORB:1.851;True;1.881;True;1.90;True
P_HAIRPIN:1.851;True;1.881;True;1.90;True
SUNNY_BEAM:1.851;True;1.881;True;1.90;True
PLUS_NECKLACE:1.851;True;1.881;True;1.90;True
CYBER_FLOWER:1.851;True;1.881;True;1.90;True
HEALING_STAFF:1.851;True;1.881;True;1.90;True
MAX_BRACELET:1.851;True;1.881;True;1.90;True
EXPLODE_SHOT:1.851;True;1.881;True;1.90;True
AIR_DASH:1.851;True;1.881;True;1.90;True
BUNNY_STRIKE:1.851;True;1.881;True;1.90;True
STRANGE_BOX:1.851;True;1.881;True;1.90;True
WALL_JUMP:1.851;True;1.881;True;1.90;True
SPIKE_BARRIER:1.851;True;1.881;True;1.90;True
BUNNY_AMULET:1.851;True;1.881;True;1.90;True
CHARGE_RING:1.851;True;1.881;True;1.90;True
CARROT_SHOOTER:1.851;True;1.881;True;1.90;True
SUPER_CARROT:1.851;True;1.881;True;1.90;True
RUMI_DONUT:1.851;True;1.881;True;1.90;True
RUMI_CAKE:1.851;True;1.881;True;1.90;True
GOLD_CARROT:1.851;True;1.881;True;1.90;True
COCOA_BOMB:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM1:1.851;True;1.881;True;1.90;True
TROPHY:1.851;True;1.881;True;1.90;True
EXCLAMATION_POINT:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM2:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM3:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM4:1.851;True;1.881;True;1.90;True
RAINBOW_MAGIC:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM5:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM6:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM7:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM8:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM9:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM10:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM11:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM12:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM13:1.851;True;1.881;True;1.90;True
UNKNOWN_ITEM14:1.851;True;1.881;True;1.90;True
BUNNY_CLOVER:1.851;True;1.881;True;1.90;True
FAIRYS_FLUTE:1.851;True;1.881;True;1.90;True
BUNNY_MEMORIES:1.851;True;1.881;True;1.90;True
WIND_BLESSING:1.851;True;1.881;True;1.90;True
DLC_ITEM4:1.851;True;1.881;True;1.90;True
BADGE_HEALTH_PLUS:1.851;True;1.881;True;1.90;True
BADGE_HEALTH_SURGE:1.851;True;1.881;True;1.90;True
BADGE_MANA_PLUS:1.851;True;1.881;True;1.90;True
BADGE_MANA_SURGE:1.851;True;1.881;True;1.90;True
BADGE_CRISIS_BOOST:1.851;True;1.881;True;1.90;True
BADGE_DEF_GROW:1.851;True;1.881;True;1.90;True
BADGE_ATK_TRADE:1.851;True;1.881;True;1.90;True
BADGE_DEF_TRADE:1.851;True;1.881;True;1.90;True
BADGE_ARM_STRENGTH:1.851;True;1.881;True;1.90;True
BADGE_CARROT_BOOST:1.851;True;1.881;True;1.90;True
BADGE_WEAKEN:1.851;True;1.881;True;1.90;True
BADGE_SELF_DEFENSE:1.851;True;1.881;True;1.90;True
BADGE_ARMORED:1.851;True;1.881;True;1.90;True
BADGE_LUCKY_SEVEN:1.851;True;1.881;True;1.90;True
BADGE_HEX_CANCEL:1.851;True;1.881;True;1.90;True
BADGE_PURE_LOVE:1.851;True;1.881;True;1.90;True
BADGE_TOXIC_STRIKE:1.851;True;1.881;True;1.90;True
BADGE_FRAME_CANCEL:1.851;True;1.881;True;1.90;True
BADGE_HEALTH_WAGER:1.851;True;1.881;True;1.90;True
BADGE_MANA_WAGER:1.851;True;1.881;True;1.90;True
BADGE_STAMINA_PLUS:1.851;True;1.881;True;1.90;True
BADGE_BLESSED:1.851;True;1.881;True;1.90;True
BADGE_HITBOX_DOWN:1.851;True;1.881;True;1.90;True
BADGE_CASHBACK:1.851;True;1.881;True;1.90;True
BADGE_SURVIVAL:1.851;True;1.881;True;1.90;True
BADGE_TOP_FORM:1.851;True;1.881;True;1.90;True
BADGE_TOUGH_SKIN:1.851;True;1.881;True;1.90;True
BADGE_ERINA_BADGE:1.851;True;1.881;True;1.90;True
BADGE_RIBBON_BADGE:1.851;True;1.881;True;1.90;True
BADGE_AUTO_TRIGGER:1.851;True;1.881;True;1.90;True
BADGE_LILITHS_GIFT:1.851;True;1.881;True;1.90;True
ITEM_PERCENT:1.851;False;0x13413E8;1.881;False;0x13423F8;1.90;False;0x1366408
MAP_PERCENT:1.851;False;0x13413E4;1.881;False;0x13423F4;1.90;False;0x1366404
RAINBOW_EGG_COUNT:1.851;True;1.881;True;1.90;True
PAUSED:1.851;False;0xC969A0;1.881;True;1.90;False;0xCBB9AC

@ -1,6 +1,11 @@
package RabiTracker;
import sig.modules.RabiRibi.OffsetHelper;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import sig.utils.DebugUtils;
import sig.utils.FileUtils;
public enum MemoryData {
MONEY(0xD654CC),
@ -145,7 +150,75 @@ public enum MemoryData {
PAUSED(0),
;
public MemoryData(long baseAddress) {
HashMap<String,Long> memoryMap = new HashMap<String,Long>();
MemoryData(long baseAddress) {
memoryMap.put("1.75", baseAddress);
}
public static void loadMemoryData() {
String[] contents = FileUtils.readFromFile("memoryData");
for (int i=0;i<contents.length;i++) {
String[] split = contents[i].split(":");
HashMap<String,Long> map = MemoryData.valueOf(split[0]).memoryMap;
String[] split_data = split[1].split(";");
int j=0;
while (j<split_data.length) {
String key = split_data[j++];
boolean relative = Boolean.parseBoolean(split_data[j++]);
if (relative) {
map.put(key,GetRelativeValue(map,key));
} else {
Long newoffset = Long.decode(split_data[j++]);
map.put(key, newoffset);
}
}
System.out.println(MemoryData.valueOf(split[0])+":");
DebugUtils.outputHashmap(map);
}
}
static Long GetRelativeValue(HashMap<String,Long> memoryMap, String key) {
switch (key) {
case "1.851":{
return memoryMap.get("1.75")+OffsetHelper.KEY_ITEM_OFFSET_V175_TO_V1851.getUpgradeAddress();
}
case "1.881":{
return memoryMap.get("1.851")+
OffsetHelper.KEY_ITEM_OFFSET_V175_TO_V1881.getUpgradeAddress()-
OffsetHelper.KEY_ITEM_OFFSET_V175_TO_V1851.getUpgradeAddress();
}
case "1.90":{
return memoryMap.get("1.881")+
OffsetHelper.KEY_ITEM_OFFSET_V175_TO_V190.getUpgradeAddress()-
OffsetHelper.KEY_ITEM_OFFSET_V175_TO_V1881.getUpgradeAddress();
}
default:{
System.out.println("WARNING! key value "+key+" does not exist! Returning -1, which is probably not what you want.");
DebugUtils.showStackTrace();
return -1l;
}
}
}
public Long getOffset() {
return memoryMap.get(Window.RABI_RIBI_VERSION);
}
enum OffsetHelper{
KEY_ITEM_OFFSET_V175_TO_V1851(0x5744D0),
KEY_ITEM_OFFSET_V175_TO_V1881(0x5754D0),
KEY_ITEM_OFFSET_V175_TO_V190(0x5994E8);
long upgradeAddress;
OffsetHelper(long baseAddr) {
this.upgradeAddress = baseAddr;
}
public long getUpgradeAddress() {
return upgradeAddress;
}
}
}
}

@ -9,6 +9,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
@ -48,6 +49,12 @@ public class MemoryManager {
}
}, 5000, 5000, TimeUnit.MILLISECONDS);
}
public void update() {
if (foundRabiRibi) {
System.out.println("Game difficulty: "+readIntFromMemory(MemoryData.GAME_DIFFICULTY));
}
}
private void CheckRabiRibiClient() {
List<Integer> pids;
@ -95,4 +102,85 @@ public class MemoryManager {
e.printStackTrace();
}
}
public int readIntFromMemory(long offset) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(rabiRibiMemOffset+offset), mem, 4, null);
return mem.getInt(0);
}
public float readFloatFromMemory(long offset) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(rabiRibiMemOffset+offset), mem, 4, null);
return mem.getFloat(0);
}
public float readFloatFromMemoryOffset(MemoryData val, long pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(pointer+val.getOffset()), mem, 4, null);
return mem.getFloat(0);
}
public int readIntFromMemoryOffset(MemoryData val, long pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(pointer+val.getOffset()), mem, 4, null);
return mem.getInt(0);
}
public float readDirectFloatFromMemoryLocation(long pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(pointer), mem, 4, null);
return mem.getFloat(0);
}
public int readDirectIntFromMemoryLocation(long pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(pointer), mem, 4, null);
return mem.getInt(0);
}
public int readIntFromPointer(MemoryData val, MemoryData pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(readIntFromMemory(pointer.getOffset())+val.getOffset()), mem, 4, null);
return mem.getInt(0);
}
public float readFloatFromPointer(MemoryData val, MemoryData pointer) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(readIntFromMemory(pointer.getOffset())+val.getOffset()), mem, 4, null);
return mem.getFloat(0);
}
public int readIntFromMemory(MemoryData val) {
return (int)readFromMemory(val,MemoryType.INTEGER);
}
public float readFloatFromMemory(MemoryData val) {
return (float)readFromMemory(val,MemoryType.FLOAT);
}
Object readFromMemory(MemoryData val, MemoryType type) {
Memory mem = new Memory(type.getSize());
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(rabiRibiMemOffset+val.getOffset()), mem, type.getSize(), null);
switch (type) {
case FLOAT:
return mem.getFloat(0);
case INTEGER:
return mem.getInt(0);
default:
System.out.println("WARNING! Type "+type+" does not have a defined value.");
return -1;
}
}
int readItemCountFromMemory(MemoryData start_range,
MemoryData end_range) {
int count=0;
for (long i=start_range.getOffset();i<=end_range.getOffset();i++) {
if (readIntFromMemory(i)==1) {
count++;
}
}
return count;
}
}

@ -0,0 +1,17 @@
package RabiTracker;
public enum MemoryType {
INTEGER(4),
FLOAT(4),
;
int bytes;
MemoryType(int bytes) {
this.bytes=bytes;
}
public int getSize() {
return bytes;
}
}

@ -30,6 +30,8 @@ public class Window extends JFrame{
public static int TICK = 0;
public static String RABI_RIBI_VERSION = "1.90"; //TODO Make a way to detect the version of the game.
JFrame window = new JFrame("Rabi Tracker v1.0");
DrawingPanel panel = new DrawingPanel(this);
@ -57,11 +59,15 @@ public class Window extends JFrame{
window.getContentPane().add(panel);
window.setVisible(true);
MemoryData.loadMemoryData();
}
private void runTick() {
Window.TICK++;
panel.repaint();
mem.update();
}
public void update() {

@ -0,0 +1,55 @@
package sig.utils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DebugUtils {
public static void showStackTrace() {
System.out.println("Trace:"+getStackTrace());
}
public static String getStackTrace() {
StackTraceElement[] stacktrace = new Throwable().getStackTrace();
StringBuilder stack = new StringBuilder("Mini stack tracer:");
for (int i=0;i<Math.min(10, stacktrace.length);i++) {
stack.append("\n"+stacktrace[i].getClassName()+": **"+stacktrace[i].getFileName()+"** "+stacktrace[i].getMethodName()+"():"+stacktrace[i].getLineNumber());
}
return stack.toString();
}
public static void outputHashmap(HashMap map) {
StringBuilder builder = new StringBuilder();
for (Object o : map.keySet()) {
Object val = map.get(o);
builder.append(o.toString()+": ");
if (val instanceof List) {
builder.append("\n");
boolean first=true;
for (Object obj : (List)val) {
if (first) {
builder.append(" "+obj.toString());
} else {
builder.append("\n "+obj.toString());
}
}
} else
if (val instanceof Map) {
builder.append("\n");
boolean first=true;
for (Object obj : ((Map) val).keySet()) {
if (first) {
builder.append(" "+obj.toString()+": "+((Map) val).get(obj).toString());
} else {
builder.append("\n "+obj.toString()+": "+((Map) val).get(obj).toString());
}
}
} else {
builder.append(val.toString());
}
builder.append("\n");
}
System.out.println(builder.toString());
}
}

@ -0,0 +1,189 @@
package sig.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.URL;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class FileUtils {
public static String[] readFromFile(String filename) {
File file = new File(filename);
//System.out.println(file.getAbsolutePath());
List<String> contents= new ArrayList<String>();
if (file.exists()) {
try(
FileReader fw = new FileReader(filename);
BufferedReader bw = new BufferedReader(fw);)
{
String readline = bw.readLine();
do {
if (readline!=null) {
//System.out.println(readline);
contents.add(readline);
readline = bw.readLine();
}} while (readline!=null);
fw.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return contents.toArray(new String[contents.size()]);
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
private static String readFilter(Reader rd, HashMap<Long,String> channel_ids) throws IOException {
StringBuilder sb = new StringBuilder();
boolean allowed=false;
boolean quotation_mark=false;
boolean endquotation_mark=false;
boolean foundChannel=false;
boolean nextBrace=false;
boolean outputStuff=false;
String numb = "";
int braceCount=0;
int channelCount=0;
int vals=0;
int cp;
while ((cp = rd.read()) != -1) {
if (braceCount==0) {
allowed=true;
} else
if (braceCount==1 && !quotation_mark){
quotation_mark=true;
numb="";
allowed=false;
} else
if (!endquotation_mark) {
if ((char)cp >= '0' &&
(char)cp <= '9') {
allowed=false;
numb+=(char)cp;
} else {
allowed=false;
endquotation_mark=true;
try {
if (channel_ids.containsKey(Long.parseLong(numb))) {
if (channelCount>=1) {
sb.append(",");
}
sb.append("\""+numb+"\"");
foundChannel=true;
System.out.println("Found channel "+numb);
outputStuff=true;
}
} catch (NumberFormatException e) {
}
}
} else
if (!nextBrace && foundChannel) {
allowed=true;
if ((char)cp == '{') {
nextBrace=true;
}
} else
if (foundChannel) {
allowed=true;
if (braceCount==1) {
allowed=false;
channelCount++;
quotation_mark=false;
endquotation_mark=false;
foundChannel=false;
nextBrace=false;
}
} else {
allowed=false;
if (braceCount==1) {
allowed=false;
quotation_mark=false;
endquotation_mark=false;
foundChannel=false;
nextBrace=false;
}
}
/*if (outputStuff && vals++<1000) {
System.out.print((char)cp);
}*/
if ((char)cp == '{') {
braceCount++;
//System.out.println("Brace count is "+braceCount+".");
} else
if ((char)cp == '}') {
braceCount--;
//System.out.println("Brace count is "+braceCount+".");
}
if (allowed) {
sb.append((char) cp);
}
}
sb.append("}");
//System.out.println("=============");
//System.out.println(sb.toString());
return sb.toString();
}
public static void writetoFile(String[] data, String filename) {
File file = new File(filename);
try {
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file,false);
PrintWriter pw = new PrintWriter(fw);
for (String s : data) {
pw.println(s);
}
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copyFile(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
public static void deleteFile(String filename) {
File file = new File(filename);
if (file.exists()) {
file.delete();
}
}
}
Loading…
Cancel
Save