Memory Values can now be obtained from Rabi-Ribi.
This commit is contained in:
parent
7ad939bbe0
commit
939e96ab6c
Binary file not shown.
111
RabiTracker/memoryData
Normal file
111
RabiTracker/memoryData
Normal file
@ -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;
|
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 {
|
public enum MemoryData {
|
||||||
MONEY(0xD654CC),
|
MONEY(0xD654CC),
|
||||||
@ -145,7 +150,75 @@ public enum MemoryData {
|
|||||||
PAUSED(0),
|
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.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import com.sun.jna.Memory;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
import com.sun.jna.platform.win32.Kernel32;
|
import com.sun.jna.platform.win32.Kernel32;
|
||||||
import com.sun.jna.platform.win32.WinNT;
|
import com.sun.jna.platform.win32.WinNT;
|
||||||
@ -49,6 +50,12 @@ public class MemoryManager {
|
|||||||
}, 5000, 5000, TimeUnit.MILLISECONDS);
|
}, 5000, 5000, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
if (foundRabiRibi) {
|
||||||
|
System.out.println("Game difficulty: "+readIntFromMemory(MemoryData.GAME_DIFFICULTY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void CheckRabiRibiClient() {
|
private void CheckRabiRibiClient() {
|
||||||
List<Integer> pids;
|
List<Integer> pids;
|
||||||
try {
|
try {
|
||||||
@ -95,4 +102,85 @@ public class MemoryManager {
|
|||||||
e.printStackTrace();
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
17
RabiTracker/src/RabiTracker/MemoryType.java
Normal file
17
RabiTracker/src/RabiTracker/MemoryType.java
Normal file
@ -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 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");
|
JFrame window = new JFrame("Rabi Tracker v1.0");
|
||||||
DrawingPanel panel = new DrawingPanel(this);
|
DrawingPanel panel = new DrawingPanel(this);
|
||||||
|
|
||||||
@ -57,11 +59,15 @@ public class Window extends JFrame{
|
|||||||
|
|
||||||
window.getContentPane().add(panel);
|
window.getContentPane().add(panel);
|
||||||
window.setVisible(true);
|
window.setVisible(true);
|
||||||
|
|
||||||
|
MemoryData.loadMemoryData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runTick() {
|
private void runTick() {
|
||||||
Window.TICK++;
|
Window.TICK++;
|
||||||
panel.repaint();
|
panel.repaint();
|
||||||
|
|
||||||
|
mem.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
|
55
RabiTracker/src/sig/utils/DebugUtils.java
Normal file
55
RabiTracker/src/sig/utils/DebugUtils.java
Normal file
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
189
RabiTracker/src/sig/utils/FileUtils.java
Normal file
189
RabiTracker/src/sig/utils/FileUtils.java
Normal file
@ -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…
x
Reference in New Issue
Block a user