Experimental stuff for now. Don't think too much about it. Branched off Rabi-Ribi Autosplitter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
6.5 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace rabiribi_splitter
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess,
int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
const int PROCESS_WM_READ = 0x0010;
private static TcpClient tcpclient;
private static NetworkStream networkStream;
private static System.Threading.Timer timer;
private int MapAddress = 0xA3353C;
private int PtrAddr = 0x00940EE0;
private int EnitiyOffset = 0x4e4;
private int EntitySize = 0x6F4;
private int MaxEntityEntry = 50;
private bool bossbattle = false;
private static Dictionary<int, string> BossNames = new Dictionary<int, string>()
{
{1009, "Cocoa"},
{1011, "Rumi"},
{1012, "Ashuri"},
{1013, "Rita"},
{1014, "Ribbon"},
{1015, "Cocoa"},
{1018, "Cicini"},
{1020, "Saya"},
{1021, "Syaro"},
{1022, "Pandora"},
{1023, "Nieve"},
{1024, "Nixie"},
{1025, "Aruraune"},
{1030, "Seana"},
{1031, "Lilith"},
{1032, "Vanilla"},
{1033, "Chocolate"},
{1035, "Illusion Alius"},
{1036, "Pink Kotri"},
{1037, "Noah 1"},
{1038, "Irisu"},
{1039, "Miriam"},
{1043, "Miru"},
{1053, "Noah 3"},
{1054, "Keke Bunny"},
};
static string[] MapNames = new string[]
{
"Southern Woodland",
"Western Coast",
"Island Core",
"Northern Tundra",
"Eastern Highlands",
"Rabi Rabi Town",
"Plurkwood",
"Subterranean Area",
"Warp Destination",
"System Interior",
};
static int[][] MapBoss = new int[][]
{
new[] {1011, 1009, 1025, 1014},
new[] {1036, 1038, 1031, 1022, 1012},
new[] {1032, 1036, 1030, 1033},
new[] {1024, 1023, 1013, 1030},
new[] {1012, 1020,},
new int[0],
new[] {1054},
new[] {1036, 1039},
new[] {1037, 1053, 1035, 1043},
new[] {1021},
};
public Form1()
{
InitializeComponent();
timer = new System.Threading.Timer(readmemory, null, 0, 10);
}
private void readmemory(object state)
{
var processlist = Process.GetProcessesByName("rabiribi");
if (processlist.Length > 0)
{
rbStatus.Text = "Running";
Process process = processlist[0];
byte[] buffer = new byte[4] {0, 0, 0, 0};
int bytesRead = 0;
IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
ReadProcessMemory((int) processHandle, process.MainModule.BaseAddress.ToInt32() + MapAddress, buffer,
1, ref bytesRead);
int mapid;
if (buffer[0] < MapNames.Length)
{
this.mapLabel.Text = MapNames[buffer[0]];
mapid = buffer[0];
ReadProcessMemory((int) processHandle, process.MainModule.BaseAddress.ToInt32() + PtrAddr, buffer, 4,
ref bytesRead);
var ptr = BitConverter.ToInt32(buffer, 0) + EnitiyOffset;
List<int> bosses = new List<int>();
for (var i = 0; i < 50; i++)
{
ptr += 0x6f4;
ReadProcessMemory((int) processHandle, ptr, buffer, buffer.Length, ref bytesRead);
var emyid = BitConverter.ToInt32(buffer, 0);
if (BossNames.ContainsKey(emyid))
{
bosses.Add(emyid);
}
}
//Now checking map
bool flag = false;
this.bossLabel.Text = "";
foreach (var i in MapBoss[mapid])
{
if (bosses.Contains(i))
{
flag = true;
this.bossLabel.Text += BossNames[i] + " ";
}
}
if (flag != bossbattle)
{
sendsplit();
}
bossbattle = flag;
}
else
{
this.mapLabel.Text = "N/A";
this.bossLabel.Text = "";
}
}
else
{
rbStatus.Text = "Not Found";
this.mapLabel.Text = "N/A";
this.bossLabel.Text = "";
}
}
void sendsplit()
{
if (tcpclient != null && tcpclient.Connected)
{
try
{
var b = Encoding.UTF8.GetBytes("split\r\n");
networkStream.Write(b,0,b.Length);
}
catch (Exception)
{
disconnect();
}
}
}
void disconnect()
{
tcpclient = null;
connectBtn.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
if (tcpclient != null && tcpclient.Connected) return;
try
{
tcpclient = new TcpClient("127.0.0.1", Convert.ToInt32(portNum.Value));
networkStream = tcpclient.GetStream();
connectBtn.Enabled = false;
}
catch (Exception)
{
tcpclient = null;
networkStream = null;
MessageBox.Show(this, "Connect Failed");
}
}
}
}