|
|
|
|
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.Text.RegularExpressions;
|
|
|
|
|
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 int bossmusicid;
|
|
|
|
|
private Regex titleReg = new Regex(@"ver.*?(\d+\.?\d+.*)$");
|
|
|
|
|
public Form1()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
timer = new System.Threading.Timer(readmemory, null, 0, 10);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void readmemory(object state)
|
|
|
|
|
{
|
|
|
|
|
string rabiver="";
|
|
|
|
|
var processlist = Process.GetProcessesByName("rabiribi");
|
|
|
|
|
if (processlist.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Process process = processlist[0];
|
|
|
|
|
var result = titleReg.Match(process.MainWindowTitle);
|
|
|
|
|
if (result.Success)
|
|
|
|
|
{
|
|
|
|
|
rabiver = result.Groups[1].Value;
|
|
|
|
|
if (!StaticData.VerNames.Contains(rabiver))
|
|
|
|
|
{
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
rbStatus.Text = rabiver + " Running (not support)";
|
|
|
|
|
this.musicLabel.Text = "N/A";
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
rbStatus.Text = rabiver + " Running (not support)";
|
|
|
|
|
this.musicLabel.Text = "N/A";
|
|
|
|
|
}));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.Invoke(new Action(() => rbStatus.Text = rabiver + " Running"));
|
|
|
|
|
int addr = StaticData.MusicAddr[rabiver];
|
|
|
|
|
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() + addr, buffer,
|
|
|
|
|
4, ref bytesRead);
|
|
|
|
|
if (buffer[0] < StaticData.MusicNames.Length)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
int musicid = BitConverter.ToInt32(buffer,0);
|
|
|
|
|
this.Invoke(new Action(() => this.musicLabel.Text = StaticData.MusicNames[musicid]));
|
|
|
|
|
|
|
|
|
|
var flag = StaticData.BossMusics.Contains(musicid);
|
|
|
|
|
if (flag)
|
|
|
|
|
{
|
|
|
|
|
if (bossmusicid > 0 && bossmusicid != musicid)
|
|
|
|
|
{
|
|
|
|
|
//直接换boss曲
|
|
|
|
|
if (cbBossStart.Checked || cbBossEnd.Checked)
|
|
|
|
|
{
|
|
|
|
|
sendsplit();
|
|
|
|
|
}
|
|
|
|
|
bossbattle = true;
|
|
|
|
|
this.Invoke(new Action(() => cbBoss.Checked = bossbattle));
|
|
|
|
|
bossmusicid = musicid;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (flag != bossbattle)
|
|
|
|
|
{
|
|
|
|
|
if (flag)
|
|
|
|
|
{
|
|
|
|
|
if (cbBossStart.Checked)
|
|
|
|
|
{
|
|
|
|
|
sendsplit();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
bossmusicid = musicid;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (cbBossEnd.Checked)
|
|
|
|
|
{
|
|
|
|
|
sendsplit();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
bossbattle = flag;
|
|
|
|
|
this.Invoke(new Action(() => cbBoss.Checked = bossbattle));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Invoke(new Action(() => this.musicLabel.Text = "N/A"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
rbStatus.Text = "Not Found";
|
|
|
|
|
this.musicLabel.Text = "N/A";
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|