refactor(ESP): 重构ESP模块代码结构,提取数据结构到独立类

feat(ESP): 新增实体绘制信息显示功能
fix(ESP): 修复坐标读取和保存的逻辑问题
style(ESP): 统一代码格式和缩进
docs(ESP): 添加关键方法注释
This commit is contained in:
GP
2025-08-14 18:41:57 +08:00
parent c02c21c4f8
commit 4747e6bbec
6 changed files with 1332 additions and 1070 deletions

View File

@@ -32,12 +32,12 @@ import com.bytecat.algui.effect.ModuleManager;
import android.text.TextUtils; import android.text.TextUtils;
public class Main { public class Main {
public static boolean alreadyloggin; public static boolean alreadyloggin;
public static boolean vt1 = true; public static boolean vt1 = true;
public static boolean vt2 = false; public static boolean vt2 = false;
public static boolean vt3 = false; public static boolean vt3 = false;
// 水印单例,全局可用 // 水印单例,全局可用
public static AlguiV.TVNoSignalText tvNoSignal = null; public static AlguiV.TVNoSignalText tvNoSignal = null;
private static ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建一个单线程线程池 private static ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建一个单线程线程池
public static void 音效播放() { public static void 音效播放() {
@@ -54,24 +54,20 @@ public static AlguiV.TVNoSignalText tvNoSignal = null;
} }
} }
public static void 音效() { public static void 音效() {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
音效播放(); // 调用音效方法 音效播放(); // 调用音效方法
} }
}).start(); }).start();
} }
public static void 远控音效() { public static void 远控音效() {
AlguiToolAudio.playAudio(aContext, "cont.ogg"); AlguiToolAudio.playAudio(aContext, "cont.ogg");
} }
public static String km;
public static String km;
// 内存修改示例 // 内存修改示例
public static boolean initialized; public static boolean initialized;
@@ -101,7 +97,6 @@ public static String km;
.addRemoteFieldName("ottwo") .addRemoteFieldName("ottwo")
.startWY(new AlguiCallback.WY2FA() { .startWY(new AlguiCallback.WY2FA() {
public void success(String kami, String user, String vip, HashMap<String, String> remote) { public void success(String kami, String user, String vip, HashMap<String, String> remote) {
} }
@@ -111,7 +106,8 @@ public static String km;
}); });
} }
private static void MyMenu(final String kami, final String expireTime, HashMap<String, String> field, final Activity currentActivity) { private static void MyMenu(final String kami, final String expireTime, HashMap<String, String> field,
final Activity currentActivity) {
AlguiToolNative.loadLibrary("Algui"); AlguiToolNative.loadLibrary("Algui");
RootService.bind(new Intent(currentActivity, AlguiRootClient.class), new AlguiRootService()); RootService.bind(new Intent(currentActivity, AlguiRootClient.class), new AlguiRootService());
@@ -137,8 +133,6 @@ public static String km;
AlguiToolNetwork.get(AlguiDocument.getAdd("codeList", markcode + ";")); AlguiToolNetwork.get(AlguiDocument.getAdd("codeList", markcode + ";"));
count++; count++;
return "欢迎新用户!你是第" + count + "个用户"; return "欢迎新用户!你是第" + count + "个用户";
} }
@@ -149,52 +143,41 @@ public static String km;
protected void onPostExecute(String result) { protected void onPostExecute(String result) {
AlguiToolAudio.playAudio(aContext, "oopen.ogg"); AlguiToolAudio.playAudio(aContext, "oopen.ogg");
alreadyloggin = true; alreadyloggin = true;
//远控 // 远控
RemoteLinkWatcher.startWatching( RemoteLinkWatcher.startWatching(
"https://sharechain.qq.com/a3d3ef114852299548ab41773813c9bc", "https://sharechain.qq.com/a3d3ef114852299548ab41773813c9bc",
"https://sharechain.qq.com/788e56aa9ad0ebb26f149c12c535e916", "https://sharechain.qq.com/788e56aa9ad0ebb26f149c12c535e916",
MIX.getContext() MIX.getContext());
);
final AlguiV a=AlguiV.Get(aContext);//获取UI快速构建器 final AlguiV a = AlguiV.Get(aContext);// 获取UI快速构建器
//绘制静态视图到屏幕上 // 绘制静态视图到屏幕上
a.WinDraw a.WinDraw(
( a.TextTag(null, "" + Build.BRAND + "\nAndroid" + Build.VERSION.RELEASE + "\nTrosCore v1.0.0",
a.TextTag(null, ""+ Build.BRAND + "\nAndroid" + Build.VERSION.RELEASE +"\nTrosCore v1.0.0", 0xCE000000, expireTime) 0xCE000000, expireTime)
.setCatTextSize(8) .setCatTextSize(8)
.setCatTextColor(0xFFFFFFFF) .setCatTextColor(0xFFFFFFFF), // 绘制的视图
,//绘制的视图 Gravity.BOTTOM | Gravity.START, // 坐标原点 (这里右上原点)
Gravity.BOTTOM | Gravity.START,//坐标原点 (这里右上原点) 10, 10, // 相对原点xy偏移
10, 10,//相对原点xy偏移 false// 视图是否可接收触摸事件
false//视图是否可接收触摸事件
); );
final AlguiV.TVNoSignalText tvNoSignal = new AlguiV.TVNoSignalText(); final AlguiV.TVNoSignalText tvNoSignal = new AlguiV.TVNoSignalText();
tvNoSignal.start("TrosCore\nAccount:"+kami); // 开 tvNoSignal.start("TrosCore\nAccount:" + kami); // 开
// 初始化 MIX
MIX.init(currentActivity);
String userName = TextUtils.isEmpty(AlguiWin2FA.wy_user)
// 初始化 MIX
MIX.init(currentActivity);
String userName = TextUtils.isEmpty(AlguiWin2FA.wy_user)
? "TrosCore用户" ? "TrosCore用户"
: AlguiWin2FA.wy_user; : AlguiWin2FA.wy_user;
ModuleManager.getInstance().setModuleEnabled( ModuleManager.getInstance().setModuleEnabled(
"TrosCore", "TrosCore",
true, true,
"Version:1.0.0 User:" + userName); "Version:1.0.0 User:" + userName);
} }
}.execute(); }.execute();
} }

View File

@@ -81,10 +81,8 @@ import android.graphics.PointF;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
// 导入数据结构类
import com.bytecat.algui.ui.category.ESPDataStructures;
public class ESPCategoryBox extends CategoryBox { public class ESPCategoryBox extends CategoryBox {
@@ -94,12 +92,10 @@ public class ESPCategoryBox extends CategoryBox {
// 保留原有的标志变量 // 保留原有的标志变量
public static final long BASE_OFFSET = 0x454090; public static final long BASE_OFFSET = 0x454090;
private static long matrixsAddr; private static long matrixsAddr;
private static float readFloatFromMemory(long address) throws NumberFormatException { private static float readFloatFromMemory(long address) throws NumberFormatException {
if (address <= 0) { if (address <= 0) {
return 0; return 0;
@@ -108,95 +104,77 @@ public class ESPCategoryBox extends CategoryBox {
return Float.parseFloat(memData); return Float.parseFloat(memData);
} }
private static Activity context; private static Activity context;
public static float x; public static float x;
public static float y; public static float y;
public static float z; public static float z;
public static File dir = new File("/storage/emulated/0/TC配置文件/");
public static File file = new File(dir, "coordinate1.txt");
public static File dir = new File("/storage/emulated/0/TC配置文件/"); public static void 获取坐标() {
public static File file = new File(dir, "coordinate1.txt"); // 1. 获取bss段基址
AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long baseAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);
// 2. 多级指针跳转计算坐标地址
long pointerPath = baseAddr + BASE_OFFSET;
long jumpAddr1 = AlguiMemTool.jump64(pointerPath);
long jumpAddr2 = AlguiMemTool.jump64(jumpAddr1 + 0x0);
long jumpAddr3 = AlguiMemTool.jump64(jumpAddr2 + 0x70);
public static void 获取坐标() { long jumpAddr4 = AlguiMemTool.jump64(jumpAddr3 + 0x10);
// 1. 获取bss段基址 long finalAddr = jumpAddr4 + 0xA0;
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 // 3. 设置坐标地址
long baseAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB); long selfZaddr = finalAddr;
// 2. 多级指针跳转计算坐标地址 long selfYaddr = selfZaddr + 0x4;
long pointerPath = baseAddr + BASE_OFFSET; long selfXaddr = selfZaddr + 0x8;
long jumpAddr1 = AlguiMemTool.jump64(pointerPath); // 4. 验证坐标值
long jumpAddr2 = AlguiMemTool.jump64(jumpAddr1 + 0x0);
long jumpAddr3 = AlguiMemTool.jump64(jumpAddr2 + 0x70);
long jumpAddr4 = AlguiMemTool.jump64(jumpAddr3 + 0x10);
long finalAddr = jumpAddr4 + 0xA0;
// 3. 设置坐标地址
long selfZaddr = finalAddr;
long selfYaddr = selfZaddr + 0x4;
long selfXaddr = selfZaddr + 0x8;
// 4. 验证坐标值
z = readFloatFromMemory(selfXaddr); z = readFloatFromMemory(selfXaddr);
x = readFloatFromMemory(selfZaddr); x = readFloatFromMemory(selfZaddr);
float y0 = readFloatFromMemory(selfYaddr); float y0 = readFloatFromMemory(selfYaddr);
y = y0+30; //高度高一点 y = y0 + 30; // 高度高一点
} }
public static void 检查() { public static void 检查() {
File dir = new File("/storage/emulated/0/TC配置文件/"); File dir = new File("/storage/emulated/0/TC配置文件/");
if (!dir.exists()) { if (!dir.exists()) {
dir.mkdirs(); // 创建文件夹 dir.mkdirs(); // 创建文件夹
} }
} }
public ESPCategoryBox() { public ESPCategoryBox() {
contentContainer contentContainer
.addView(createchushSwitchContentCard())
.addView(createhzmbSwitchContentCard())
.addView(createddhzSwitchContentCard())
.addView(createchushSwitchContentCard()) ;
.addView(createhzmbSwitchContentCard())
.addView(createddhzSwitchContentCard())
;
} }
private SwitchContentCard createchushSwitchContentCard() {
final SwitchContentCard chushSwitchContentCard = new SwitchContentCard("初始化", "初始化相关数据")
private SwitchContentCard createchushSwitchContentCard() { .OText("初始化", "初始化相关数据", "Initialize", "Initialize relevant data").setChecked(false);
final SwitchContentCard chushSwitchContentCard = new SwitchContentCard("初始化", "初始化相关数据").OText("初始化", "初始化相关数据","Initialize","Initialize relevant data").setChecked(false);
chushSwitchContentCard.setSwitchCallback(new SwitchCallback() { chushSwitchContentCard.setSwitchCallback(new SwitchCallback() {
@Override @Override
public boolean onChecked(boolean newState) { public boolean onChecked(boolean newState) {
Main.音效(); Main.音效();
AlguiMemTool.setPackageName("com.vortex.celestial"); AlguiMemTool.setPackageName("com.vortex.celestial");
if (newState) { if (newState) {
notification.make("绘制", "已开启","ESP","Open", Notification.Type.SUCCESS); notification.make("绘制", "已开启", "ESP", "Open", Notification.Type.SUCCESS);
ModuleManager.getInstance().setModuleEnabled("绘制|ESP", true); ModuleManager.getInstance().setModuleEnabled("绘制|ESP", true);
zhenespkg = true; zhenespkg = true;
// 启动 // 启动
draw = Fastesp.start(context); draw = Fastesp.start(context);
draw.startDraw(); draw.startDraw();
} else { } else {
notification.make("绘制", "已关闭","ESP","close", Notification.Type.ERROR); notification.make("绘制", "已关闭", "ESP", "close", Notification.Type.ERROR);
ModuleManager.getInstance().setModuleEnabled("绘制|ESP", false); ModuleManager.getInstance().setModuleEnabled("绘制|ESP", false);
zhenespkg = false; zhenespkg = false;
// 停止 // 停止
Fastesp.stop(); Fastesp.stop();
} }
return true; return true;
@@ -204,104 +182,79 @@ Fastesp.stop();
}); });
return chushSwitchContentCard; return chushSwitchContentCard;
} }
private BoxContentCard createhzmbSwitchContentCard() {
private BoxContentCard createhzmbSwitchContentCard() {
// 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置 // 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置
final BoxContentCard hzmbSwitchContentCard = new BoxContentCard("目标", "选择绘制的目标") final BoxContentCard hzmbSwitchContentCard = new BoxContentCard("目标", "选择绘制的目标")
.OText("目标", "选择绘制的目标", "The goal of drawing", "Select the target for drawing") .OText("目标", "选择绘制的目标", "The goal of drawing", "Select the target for drawing")
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang"); .setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
// 创建一个可折叠的内容区域,用于放置设置选项 // 创建一个可折叠的内容区域,用于放置设置选项
Column column = new Column() Column column = new Column()
.setLayoutParams(new LinearParams() .setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent) // 宽度填满父视图 .setWidth(BaseHelper.MatchParent) // 宽度填满父视图
.setHeight(BaseHelper.WrapContent) // 高度自适应内容 .setHeight(BaseHelper.WrapContent) // 高度自适应内容
.setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp .setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp
hzmbSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中 hzmbSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中
final StatefulButton statefulButton = new StatefulButton("玩家", "player", true);
final StatefulButton statefulButton = new StatefulButton("玩家","player", true);
statefulButton.setSwitchCallback(new SwitchCallback() { statefulButton.setSwitchCallback(new SwitchCallback() {
@Override @Override
public boolean onChecked(boolean newState) { public boolean onChecked(boolean newState) {
if (zhenespkg) if (zhenespkg)
if (newState) { if (newState) {
Fastesp.setDrawPlayers(true); Fastesp.setDrawPlayers(true);
}else{ } else {
Fastesp.setDrawPlayers(false); Fastesp.setDrawPlayers(false);
} }
return true; return true;
} }
}); });
final StatefulButton statefulButton2 = new StatefulButton("物品","Article", false); final StatefulButton statefulButton2 = new StatefulButton("物品", "Article", false);
statefulButton2.setSwitchCallback(new SwitchCallback() { statefulButton2.setSwitchCallback(new SwitchCallback() {
@Override @Override
public boolean onChecked(boolean newState) { public boolean onChecked(boolean newState) {
if (zhenespkg) if (zhenespkg)
if (newState) { if (newState) {
Fastesp.setDrawItems(true); Fastesp.setDrawItems(true);
}else{ } else {
Fastesp.setDrawItems(false); Fastesp.setDrawItems(false);
} }
return true; return true;
} }
}); });
// 创建第一行按钮 // 创建第一行按钮
Row buttonRow1 = new Row(); Row buttonRow1 = new Row();
buttonRow1.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent).setHeight(BaseHelper.WrapContent)); buttonRow1
.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent).setHeight(BaseHelper.WrapContent));
buttonRow1.addView(statefulButton); buttonRow1.addView(statefulButton);
buttonRow1.addView(statefulButton2); buttonRow1.addView(statefulButton2);
column.addView(buttonRow1); column.addView(buttonRow1);
return hzmbSwitchContentCard; // 返回创建的卡片 return hzmbSwitchContentCard; // 返回创建的卡片
} }
private BoxContentCard createddhzSwitchContentCard() {
private BoxContentCard createddhzSwitchContentCard() {
// 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置 // 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置
final BoxContentCard ddhzSwitchContentCard = new BoxContentCard("定点", "绘制一个可以保存的固定红点") final BoxContentCard ddhzSwitchContentCard = new BoxContentCard("定点", "绘制一个可以保存的固定红点")
.OText("定点", "绘制一个可以保存的固定红点", "Fixed point", "Draw a fixed red dot that can be saved") .OText("定点", "绘制一个可以保存的固定红点", "Fixed point", "Draw a fixed red dot that can be saved")
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang"); .setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
// 创建一个可折叠的内容区域,用于放置设置选项 // 创建一个可折叠的内容区域,用于放置设置选项
Column column = new Column() Column column = new Column()
.setLayoutParams(new LinearParams() .setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent) // 宽度填满父视图 .setWidth(BaseHelper.MatchParent) // 宽度填满父视图
.setHeight(BaseHelper.WrapContent) // 高度自适应内容 .setHeight(BaseHelper.WrapContent) // 高度自适应内容
.setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp .setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp
ddhzSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中 ddhzSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中
final Text label1 = new Text() final Text label1 = new Text()
.setText("x="+"y="+"z=") .setText("x=" + "y=" + "z=")
.setTextSize(10f) .setTextSize(10f)
.setTextColor(0xFFC5C5C5) .setTextColor(0xFFC5C5C5)
.setTypeface(Typeface.DEFAULT_BOLD) .setTypeface(Typeface.DEFAULT_BOLD)
@@ -310,11 +263,9 @@ ddhzSwitchContentCard.setExpandableContent(column); // 将内容区域设置到
.setBottomMargin(dip2pxInt(5))); .setBottomMargin(dip2pxInt(5)));
column.addView(label1); column.addView(label1);
final StatefulButton statefulButton1 = new StatefulButton("创建", "Create", false);
statefulButton1.setSwitchCallback(new SwitchCallback() {
final StatefulButton statefulButton1 = new StatefulButton("创建", "Create", false);
statefulButton1.setSwitchCallback(new SwitchCallback() {
@Override @Override
public boolean onChecked(boolean newState) { public boolean onChecked(boolean newState) {
File langFile = new File("/sdcard/Android/data/com.vortex.celestial/files/switch.lang"); File langFile = new File("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
@@ -323,63 +274,65 @@ statefulButton1.setSwitchCallback(new SwitchCallback() {
if (newState) { if (newState) {
// 开启状态 // 开启状态
Fastesp.creatred(x,y,z,"id"); Fastesp.creatred(x, y, z, "id");
statefulButton1.text.setText(isChinese ? "删除" : "Delete"); statefulButton1.text.setText(isChinese ? "删除" : "Delete");
} else { } else {
// 关闭状态 // 关闭状态
Fastesp.deletered("id"); Fastesp.deletered("id");
statefulButton1.text.setText(isChinese ? "创建" : "Create"); statefulButton1.text.setText(isChinese ? "创建" : "Create");
} }
return true; // 允许状态变化 return true; // 允许状态变化
} }
}); });
final Text shu1 = new Text() final Text shu1 = new Text()
.setText("") .setText("")
.setTextSize(15f) .setTextSize(15f)
.setTextColor(0xFFC5C5C5) .setTextColor(0xFFC5C5C5)
.setTypeface(Typeface.DEFAULT_BOLD) .setTypeface(Typeface.DEFAULT_BOLD)
.setLayoutParams(new LinearParams().setHeight(BaseHelper.WrapContent) .setLayoutParams(new LinearParams().setHeight(BaseHelper.WrapContent));
);
final RadioGroup radioGroup1 = new RadioGroup() final RadioGroup radioGroup1 = new RadioGroup()
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang"); .setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
radioGroup1.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent)); radioGroup1.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent));
radioGroup1.setEnabled(true); radioGroup1.setEnabled(true);
radioGroup1.addButton("获取", "Get", "1"); radioGroup1.addButton("获取", "Get", "1");
radioGroup1.addButton("保存", "Save", "2"); radioGroup1.addButton("保存", "Save", "2");
radioGroup1.addButton("读取", "Load", "3"); radioGroup1.addButton("读取", "Load", "3");
radioGroup1.addButton("传送", "Teleport", "4"); radioGroup1.addButton("传送", "Teleport", "4");
// ✅ 关键:取消默认选中 // ✅ 关键:取消默认选中
for (StatefulButton btn : radioGroup1.map.values()) { for (StatefulButton btn : radioGroup1.map.values()) {
btn.setChecked(false); btn.setChecked(false);
} }
radioGroup1.setRadioGroupCallback(new RadioGroupCallback() { radioGroup1.setRadioGroupCallback(new RadioGroupCallback() {
@Override @Override
public void onChecked(String id) { public void onChecked(String id) {
switch (id) { switch (id) {
case "1"://获取 case "1":// 获取
获取坐标(); 获取坐标();
label1.setText("x=" + x + "y=" + y + "z=" + z); label1.setText("x=" + x + "y=" + y + "z=" + z);
break; break;
case "2"://保存 case "2":// 保存
检查(); 检查();
if (!file.exists()) { if (!file.exists()) {
try { try {
file.createNewFile(); // 创建文件 file.createNewFile(); // 创建文件
} catch (IOException e) {e.printStackTrace();} } catch (IOException e) {
e.printStackTrace();
}
} }
try { try {
if (!dir.exists()) dir.mkdirs(); if (!dir.exists())
dir.mkdirs();
BufferedWriter bw = new BufferedWriter(new FileWriter(file)); BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("x=" + x); bw.write("x=" + x);
@@ -388,12 +341,12 @@ try {
bw.newLine(); bw.newLine();
bw.write("z=" + z); bw.write("z=" + z);
bw.close(); bw.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
break; break;
case "3"://读取 case "3":// 读取
try { try {
if (file.exists()) { if (file.exists()) {
BufferedReader br = new BufferedReader(new FileReader(file)); BufferedReader br = new BufferedReader(new FileReader(file));
@@ -409,34 +362,42 @@ try {
} }
br.close(); br.close();
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
label1.setText("x=" + x + "y=" + y + "z=" + z); label1.setText("x=" + x + "y=" + y + "z=" + z);
break; break;
case "4"://传送 case "4":// 传送
//x // x
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.clearResultList(); // 清空之前的搜索结果 AlguiMemTool.clearResultList(); // 清空之前的搜索结果
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB); // 获取模块基址 long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB); // 获取模块基址
long zuobiaox = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10) + 0xA8; // 跳转指针 long zuobiaox = AlguiMemTool
long zuobiaoy = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10) + 0xA4; // 跳转指针 .jump64(AlguiMemTool.jump64(
long zuobiaoz = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10) + 0xA0; // 跳转指针 AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10)
+ 0xA8; // 跳转指针
long zuobiaoy = AlguiMemTool
.jump64(AlguiMemTool.jump64(
AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10)
+ 0xA4; // 跳转指针
long zuobiaoz = AlguiMemTool
.jump64(AlguiMemTool.jump64(
AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x454090) + 0x0) + 0x70) + 0x10)
+ 0xA0; // 跳转指针
AlguiMemTool.setMemoryAddrValue(""+y, zuobiaoy,AlguiMemTool.TYPE_FLOAT, false,true); AlguiMemTool.setMemoryAddrValue("" + y, zuobiaoy, AlguiMemTool.TYPE_FLOAT, false, true);
AlguiMemTool.setMemoryAddrValue(""+z, zuobiaox,AlguiMemTool.TYPE_FLOAT, false,true); AlguiMemTool.setMemoryAddrValue("" + z, zuobiaox, AlguiMemTool.TYPE_FLOAT, false, true);
AlguiMemTool.setMemoryAddrValue(""+x, zuobiaoz,AlguiMemTool.TYPE_FLOAT, false ,true); AlguiMemTool.setMemoryAddrValue("" + x, zuobiaoz, AlguiMemTool.TYPE_FLOAT, false, true);
AlguiMemTool.setMemoryAddrValue(""+y, zuobiaoy,AlguiMemTool.TYPE_FLOAT, false,true); AlguiMemTool.setMemoryAddrValue("" + y, zuobiaoy, AlguiMemTool.TYPE_FLOAT, false, true);
AlguiMemTool.setMemoryAddrValue(""+z, zuobiaox,AlguiMemTool.TYPE_FLOAT, false,true); AlguiMemTool.setMemoryAddrValue("" + z, zuobiaox, AlguiMemTool.TYPE_FLOAT, false, true);
AlguiMemTool.setMemoryAddrValue(""+x, zuobiaoz,AlguiMemTool.TYPE_FLOAT, false ,true); AlguiMemTool.setMemoryAddrValue("" + x, zuobiaoz, AlguiMemTool.TYPE_FLOAT, false, true);
break; break;
} }
} }
}); });
Row buttonRow1 = new Row()
Row buttonRow1 = new Row()
.setLayoutParams(new LinearParams() .setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent) .setWidth(BaseHelper.MatchParent)
.setHeight(BaseHelper.WrapContent) .setHeight(BaseHelper.WrapContent)
@@ -446,77 +407,12 @@ Row buttonRow1 = new Row()
buttonRow1.addView(shu1); buttonRow1.addView(shu1);
buttonRow1.addView(radioGroup1); buttonRow1.addView(radioGroup1);
// 把这一行添加到 column 中 // 把这一行添加到 column 中
column.addView(buttonRow1); column.addView(buttonRow1);
return ddhzSwitchContentCard; // 返回创建的卡片 return ddhzSwitchContentCard; // 返回创建的卡片
} }
private enum Color {
RED(0xFFFF0000), // 红色
GREEN(0xFF00FF00), // 绿色
BLUE(0xFF0000FF), // 蓝色
YELLOW(0xFFFFFF00), // 黄色
WHITE(0xFFFFFFFF), // 白色
BLACK(0xFF000000), // 黑色
ORANGE(0xFFFFA500), // 橙色
PURPLE(0xFF800080), // 紫色
PINK(0xFFFFC0CB), // 粉色
CYAN(0xFF00FFFF), // 青色
MAGENTA(0xFFFF00FF), // 洋红色
GRAY(0xFF808080); // 灰色
private final int value; // 存储颜色值
// 私有构造函数
Color(int value) {
this.value = value;
}
// 获取颜色值的方法
public int getValue() {
return value;
}
}
private enum CollisionBodyType {
ENTITY, // 实体
PLAYER, // 角色
PICKUP // 拾取物
}
// 碰撞体对象
private static class CollisionBody {
long address; // 内存地址
CollisionBodyType type; // 类型
int feature1; // 特征值1
int feature2; // 特征值2
}
// 绘制对象
private static class DrawObject {
long address; // 内存地址
Color color; // 颜色
CollisionBodyType type; // 类型
int dis;
int x;
int y;
}
private static final int pSize = 8; private static final int pSize = 8;
// 被选中对象内存地址 // 被选中对象内存地址
private static long selectedAddr = 0; private static long selectedAddr = 0;
@@ -528,16 +424,15 @@ Row buttonRow1 = new Row()
static long collAddrStart; static long collAddrStart;
// 碰撞体列表 // 碰撞体列表
private static CopyOnWriteArrayList<CollisionBody> collList = new private static CopyOnWriteArrayList<ESPDataStructures.CollisionBody> collList = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<>();
// 绘制对象列表 // 绘制对象列表
private static ArrayList<DrawObject> drawList = new ArrayList<>(); private static ArrayList<ESPDataStructures.DrawObject> drawList = new ArrayList<>();
// 是否开启ESP(不是) // 是否开启ESP(不是)
private static boolean espkg =true; private static boolean espkg = true;
// 是否开启ESP("这个才是) // 是否开启ESP("这个才是)
private static boolean zhenespkg =false; private static boolean zhenespkg = false;
// 是否绘制所有碰撞体 // 是否绘制所有碰撞体
private static boolean isDrawALLColl = false; private static boolean isDrawALLColl = false;
@@ -575,7 +470,6 @@ Row buttonRow1 = new Row()
if (collAddr <= 0) if (collAddr <= 0)
return false; return false;
collAddrStart = jump(collAddr); // 更新 collAddrStart 的值 collAddrStart = jump(collAddr); // 更新 collAddrStart 的值
return true; // 成功获取地址 return true; // 成功获取地址
} }
@@ -583,15 +477,15 @@ Row buttonRow1 = new Row()
// 数组更新方法 // 数组更新方法
private static void updateArray() { private static void updateArray() {
// 创建临时列表存储新数据 // 创建临时列表存储新数据
ArrayList<DrawObject> newCollList = new ArrayList<>(); ArrayList<ESPDataStructures.DrawObject> newCollList = new ArrayList<>();
try { try {
int size = Integer.parseInt(AlguiMemTool.getMemoryAddrData(collAddr + 0x2C, AlguiMemTool.TYPE_DWORD)); int size = Integer.parseInt(AlguiMemTool.getMemoryAddrData(collAddr + 0x2C, AlguiMemTool.TYPE_DWORD));
// 遍历碰撞体数组并过滤 // 遍历碰撞体数组并过滤
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
CollisionBody p = new CollisionBody(); ESPDataStructures.CollisionBody p = new ESPDataStructures.CollisionBody();
DrawObject d = new DrawObject(); ESPDataStructures.DrawObject d = new ESPDataStructures.DrawObject();
p.address = jump(collAddrStart + i * pSize); p.address = jump(collAddrStart + i * pSize);
// 批量读取内存数据提高性能 // 批量读取内存数据提高性能
@@ -603,19 +497,19 @@ Row buttonRow1 = new Row()
if (p.feature2 == 196614) { if (p.feature2 == 196614) {
if (isDrawPlayer && p.feature1 == 17039361) { if (isDrawPlayer && p.feature1 == 17039361) {
d.address = p.address; d.address = p.address;
d.color = Color.GREEN; d.color = ESPDataStructures.Color.GREEN;
d.type = CollisionBodyType.PLAYER; d.type = ESPDataStructures.CollisionBodyType.PLAYER;
newCollList.add(d); newCollList.add(d);
} else if (isDrawPickup && p.feature1 == 17039617) { } else if (isDrawPickup && p.feature1 == 17039617) {
d.address = p.address; d.address = p.address;
d.color = Color.PURPLE; d.color = ESPDataStructures.Color.PURPLE;
d.type = CollisionBodyType.PICKUP; d.type = ESPDataStructures.CollisionBodyType.PICKUP;
newCollList.add(d); newCollList.add(d);
} }
} else if (isDrawALLColl) { } else if (isDrawALLColl) {
d.address = p.address; d.address = p.address;
d.color = Color.GRAY; d.color = ESPDataStructures.Color.GRAY;
d.type = CollisionBodyType.ENTITY; d.type = ESPDataStructures.CollisionBodyType.ENTITY;
newCollList.add(d); newCollList.add(d);
} }
} }
@@ -652,12 +546,8 @@ Row buttonRow1 = new Row()
} }
// 初始化绘制窗口方法 // 初始化绘制窗口方法
private static AlguiWinDraw initDraw(Context context) { private static AlguiWinDraw initDraw(Context context) {
return Fastesp.start(context); return Fastesp.start(context);
} }
} }

View File

@@ -0,0 +1,219 @@
package com.bytecat.algui.ui.category;
import android.graphics.Typeface;
import com.bytecat.algui.AlguiHacker.AlguiMemTool;
import com.bytecat.algui.base.BaseHelper;
import com.bytecat.algui.callback.SwitchCallback;
import com.bytecat.algui.component.Column;
import com.bytecat.algui.component.Row;
import com.bytecat.algui.component.Text;
import com.bytecat.algui.effect.Notification;
import com.bytecat.algui.layoutparams.LinearParams;
import com.bytecat.algui.ui.MIX;
import com.bytecat.algui.ui.component.CategoryBox;
import com.bytecat.algui.ui.component.StatefulButton;
import com.bytecat.algui.ui.component.BoxContentCard;
import com.bytecat.algui.ui.component.SwitchContentCard;
import com.bytecat.algui.ui.component.RadioGroup;
import com.bytecat.algui.callback.RadioGroupCallback;
import com.bytecat.algui.AlguiWindows.AlguiWinDraw;
import com.bytecat.algui.ui.Main;
import com.bytecat.algui.effect.ModuleManager;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArrayList;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ESPCategoryBox_Copy extends CategoryBox {
Notification notification = Notification.getInstance();
public static final long BASE_OFFSET = 0x454090;
private static float readFloatFromMemory(long address) throws NumberFormatException {
if (address <= 0) {
return 0;
}
String memData = AlguiMemTool.getMemoryAddrData(address, AlguiMemTool.TYPE_FLOAT);
return Float.parseFloat(memData);
}
// 配置文件目录
public static File configDir = new File("/storage/emulated/0/TC配置文件/");
// 坐标文件
public static File coordinateFile = new File(configDir, "coordinate1.txt");
// 检查并创建配置文件目录
public static void checkAndCreateConfigDir() {
if (!configDir.exists()) {
configDir.mkdirs(); // 创建文件夹
}
}
public ESPCategoryBox_Copy() {
contentContainer
.addView(createchushSwitchContentCard())
.addView(createhzmbSwitchContentCard())
.addView(createddhzSwitchContentCard());
}
private SwitchContentCard createchushSwitchContentCard() {
final SwitchContentCard chushSwitchContentCard = new SwitchContentCard("初始化", "初始化相关数据")
.OText("初始化", "初始化相关数据", "Initialize", "Initialize relevant data").setChecked(false);
chushSwitchContentCard.setSwitchCallback(new SwitchCallback() {
@Override
public boolean onChecked(boolean newState) {
// TODO: 实现初始化开关的逻辑
return true;
}
});
return chushSwitchContentCard;
}
private BoxContentCard createhzmbSwitchContentCard() {
// 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置
final BoxContentCard hzmbSwitchContentCard = new BoxContentCard("目标", "选择绘制的目标")
.OText("目标", "选择绘制的目标", "The goal of drawing", "Select the target for drawing")
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
// 创建一个可折叠的内容区域,用于放置设置选项
Column column = new Column()
.setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent) // 宽度填满父视图
.setHeight(BaseHelper.WrapContent) // 高度自适应内容
.setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp
hzmbSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中
final StatefulButton statefulButton = new StatefulButton("玩家", "player", true);
statefulButton.setSwitchCallback(new SwitchCallback() {
@Override
public boolean onChecked(boolean newState) {
// TODO: 实现玩家绘制开关的逻辑
return true;
}
});
final StatefulButton statefulButton2 = new StatefulButton("物品", "Article", false);
statefulButton2.setSwitchCallback(new SwitchCallback() {
@Override
public boolean onChecked(boolean newState) {
// TODO: 实现物品绘制开关的逻辑
return true;
}
});
// 创建第一行按钮
Row buttonRow1 = new Row();
buttonRow1
.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent).setHeight(BaseHelper.WrapContent));
buttonRow1.addView(statefulButton);
buttonRow1.addView(statefulButton2);
column.addView(buttonRow1);
return hzmbSwitchContentCard; // 返回创建的卡片
}
private BoxContentCard createddhzSwitchContentCard() {
// 创建一个可切换内容的卡片,用于显示和管理核心碰撞箱的设置
final BoxContentCard ddhzSwitchContentCard = new BoxContentCard("定点", "绘制一个可以保存的固定红点")
.OText("定点", "绘制一个可以保存的固定红点", "Fixed point", "Draw a fixed red dot that can be saved")
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
// 创建一个可折叠的内容区域,用于放置设置选项
Column column = new Column()
.setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent) // 宽度填满父视图
.setHeight(BaseHelper.WrapContent) // 高度自适应内容
.setTopMargin(dip2pxInt(15))); // 顶部外边距为15dp
ddhzSwitchContentCard.setExpandableContent(column); // 将内容区域设置到卡片中
final Text label1 = new Text()
.setText("x=" + "y=" + "z=")
.setTextSize(10f)
.setTextColor(0xFFC5C5C5)
.setTypeface(Typeface.DEFAULT_BOLD)
.setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent)
.setBottomMargin(dip2pxInt(5)));
column.addView(label1);
final StatefulButton statefulButton1 = new StatefulButton("创建", "Create", false);
statefulButton1.setSwitchCallback(new SwitchCallback() {
@Override
public boolean onChecked(boolean newState) {
// TODO: 实现定点创建/删除按钮的逻辑
return true;
}
});
final Text shu1 = new Text()
.setText("")
.setTextSize(15f)
.setTextColor(0xFFC5C5C5)
.setTypeface(Typeface.DEFAULT_BOLD)
.setLayoutParams(new LinearParams().setHeight(BaseHelper.WrapContent));
final RadioGroup radioGroup1 = new RadioGroup()
.setLanguageSwitchFilePath("/sdcard/Android/data/com.vortex.celestial/files/switch.lang");
radioGroup1.setLayoutParams(new LinearParams().setWidth(BaseHelper.MatchParent));
radioGroup1.setEnabled(true);
radioGroup1.addButton("获取", "Get", "1");
radioGroup1.addButton("保存", "Save", "2");
radioGroup1.addButton("读取", "Load", "3");
radioGroup1.addButton("传送", "Teleport", "4");
// ✅ 关键:取消默认选中
for (StatefulButton btn : radioGroup1.map.values()) {
btn.setChecked(false);
}
radioGroup1.setRadioGroupCallback(new RadioGroupCallback() {
@Override
public void onChecked(String id) {
// TODO: 实现单选按钮组的逻辑
switch (id) {
case "1":// 获取
// TODO: 实现获取坐标逻辑
break;
case "2":// 保存
// TODO: 实现保存坐标逻辑
break;
case "3":// 读取
// TODO: 实现读取坐标逻辑
break;
case "4":// 传送
// TODO: 实现传送逻辑
break;
}
}
});
Row buttonRow1 = new Row()
.setLayoutParams(new LinearParams()
.setWidth(BaseHelper.MatchParent)
.setHeight(BaseHelper.WrapContent)
.setTopMargin(dip2pxInt(10)));
buttonRow1.addView(statefulButton1);
buttonRow1.addView(shu1);
buttonRow1.addView(radioGroup1);
// 把这一行添加到 column 中
column.addView(buttonRow1);
return ddhzSwitchContentCard; // 返回创建的卡片
}
}

View File

@@ -0,0 +1,64 @@
package com.bytecat.algui.ui.category;
public class ESPDataStructures {
/**
* 颜色枚举
*/
public enum Color {
RED(0xFFFF0000), // 红色
GREEN(0xFF00FF00), // 绿色
BLUE(0xFF0000FF), // 蓝色
YELLOW(0xFFFFFF00), // 黄色
WHITE(0xFFFFFFFF), // 白色
BLACK(0xFF000000), // 黑色
ORANGE(0xFFFFA500), // 橙色
PURPLE(0xFF800080), // 紫色
PINK(0xFFFFC0CB), // 粉色
CYAN(0xFF00FFFF), // 青色
MAGENTA(0xFFFF00FF), // 洋红色
GRAY(0xFF808080); // 灰色
private final int value; // 存储颜色值
// 私有构造函数
Color(int value) {
this.value = value;
}
// 获取颜色值的方法
public int getValue() {
return value;
}
}
/**
* 碰撞体类型枚举
*/
public enum CollisionBodyType {
ENTITY, // 实体
PLAYER, // 角色
PICKUP // 拾取物
}
/**
* 碰撞体对象
*/
public class CollisionBody {
public long address; // 内存地址
public CollisionBodyType type; // 类型
public int feature1; // 特征值1
public int feature2; // 特征值2
}
/**
* 绘制对象
*/
public class DrawObject {
public long address; // 内存地址
public Color color; // 颜色
public CollisionBodyType type; // 类型
public int dis;
public int x;
public int y;
}
}

View File

@@ -49,7 +49,8 @@ public class Fastesp {
private static final ConcurrentHashMap<String, Float> redPointsWorldZ = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, Float> redPointsWorldZ = new ConcurrentHashMap<>();
public static AlguiWinDraw start(Context ctx) { public static AlguiWinDraw start(Context ctx) {
if (ctx == null) ctx = MIX.getContext(); if (ctx == null)
ctx = MIX.getContext();
if (ctx == null) if (ctx == null)
throw new IllegalStateException("Context 为 null请先初始化 MIX 或传入 Activity"); throw new IllegalStateException("Context 为 null请先初始化 MIX 或传入 Activity");
running = true; running = true;
@@ -57,18 +58,19 @@ public class Fastesp {
return draw; return draw;
} }
private static final int MODE_JOY = 0; // 摇杆模式 private static final int MODE_JOY = 0; // 摇杆模式
private static final int MODE_MOVE = 1; // 移动模式 private static final int MODE_MOVE = 1; // 移动模式
private static int mode = MODE_JOY; // 当前模式 private static int mode = MODE_JOY; // 当前模式
private static long lastDownTime = 0; // 用于双击判断 private static long lastDownTime = 0; // 用于双击判断
private static final int DOUBLE_TAP_TIMEOUT = 300; // ms private static final int DOUBLE_TAP_TIMEOUT = 300; // ms
// 摇杆当前输出向量 [-1,1] // 摇杆当前输出向量 [-1,1]
public static float joystickX; public static float joystickX;
public static float joystickY; public static float joystickY;
// 是否正在用摇杆 // 是否正在用摇杆
public static boolean isJoystickMove; public static boolean isJoystickMove;
// ================== 摇杆控件 ==================
private static class JoystickView extends View { // ================== 摇杆控件 ==================
private static class JoystickView extends View {
/* ==== 基本尺寸 ==== */ /* ==== 基本尺寸 ==== */
private float baseX, baseY; // 摇杆底座中心(可拖动) private float baseX, baseY; // 摇杆底座中心(可拖动)
private float bigR, smallR; private float bigR, smallR;
@@ -101,14 +103,16 @@ private static class JoystickView extends View {
} }
/* ==== 绘制 ==== */ /* ==== 绘制 ==== */
@Override protected void onDraw(Canvas canvas) { @Override
protected void onDraw(Canvas canvas) {
canvas.drawCircle(baseX, baseY, bigR, bgPaint); canvas.drawCircle(baseX, baseY, bigR, bgPaint);
canvas.drawCircle(knobX, knobY, smallR, knobPaint); canvas.drawCircle(knobX, knobY, smallR, knobPaint);
} }
/* ==== 触摸 ==== */ /* ==== 触摸 ==== */
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override public boolean onTouchEvent(MotionEvent e) { @Override
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX(); float x = e.getX();
float y = e.getY(); float y = e.getY();
@@ -181,58 +185,59 @@ private static class JoystickView extends View {
knobX = baseX + dx; knobX = baseX + dx;
knobY = baseY + dy; knobY = baseY + dy;
invalidate(); invalidate();
// 在 JoystickView.moveKnob() 末尾加一行 // 在 JoystickView.moveKnob() 末尾加一行
Fastesp.joystickX = dx / bigR; // 已归一化 Fastesp.joystickX = dx / bigR; // 已归一化
Fastesp.joystickY = -dy / bigR; // 屏幕坐标系转游戏坐标系 Fastesp.joystickY = -dy / bigR; // 屏幕坐标系转游戏坐标系
Fastesp.isJoystickMove = draggingKnob; Fastesp.isJoystickMove = draggingKnob;
/* TODO: 如果需要把摇杆向量输出出去,可以在这里回调 /*
float vx = dx / bigR; * TODO: 如果需要把摇杆向量输出出去,可以在这里回调
float vy = -dy / bigR; * float vx = dx / bigR;
* float vy = -dy / bigR;
*/ */
} }
private float dist(float x1, float y1, float x2, float y2) { private float dist(float x1, float y1, float x2, float y2) {
return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
} }
} }
/* 专门给路径记录用的红点,旁边固定写“路径点” */
public static void createPathPoint(float x, float y, float z, String id) {
/* 专门给路径记录用的红点,旁边固定写“路径点” */
public static void createPathPoint(float x, float y, float z, String id) {
redPointsWorldX.put(id, x); redPointsWorldX.put(id, x);
redPointsWorldY.put(id, y); redPointsWorldY.put(id, y);
redPointsWorldZ.put(id, z); redPointsWorldZ.put(id, z);
} }
// ============================================= // =============================================
private static JoystickView joystick;
private static JoystickView joystick; private static Thread moveThread;
private static volatile boolean moveRunning;
private static Thread moveThread; public static void startMoveThread() {
private static volatile boolean moveRunning; if (moveThread != null)
return;
public static void startMoveThread() {
if (moveThread != null) return;
moveRunning = true; moveRunning = true;
moveThread = new Thread(new Runnable() { moveThread = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
/* ↓↓↓ 原来花括号里的代码全部原封不动搬进来 ↓↓↓ */ /* ↓↓↓ 原来花括号里的代码全部原封不动搬进来 ↓↓↓ */
int pid = AlguiMemTool.getPID("com.vortex.celestial"); int pid = AlguiMemTool.getPID("com.vortex.celestial");
if (pid < 0) return; if (pid < 0)
return;
long libClient = AlguiMemTool.getModuleBaseAddr("libclient.so", AlguiMemTool.HEAD_CB); long libClient = AlguiMemTool.getModuleBaseAddr("libclient.so", AlguiMemTool.HEAD_CB);
if (libClient == 0) return; if (libClient == 0)
return;
long matrixAddr = AlguiMemTool.jump64( long matrixAddr = AlguiMemTool.jump64(
AlguiMemTool.jump64( AlguiMemTool.jump64(
AlguiMemTool.jump64( AlguiMemTool.jump64(
AlguiMemTool.jump64(libClient + 0x45A228) + 0x268) + 0xE0) + 0x40); AlguiMemTool.jump64(libClient + 0x45A228) + 0x268) + 0xE0)
+ 0x40);
long oneselfBase = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(libClient + 0x454090) + 0x0) + 0x70) + 0x10; // 跳转指针 long oneselfBase = AlguiMemTool
.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(libClient + 0x454090) + 0x0) + 0x70) + 0x10; // 跳转指针
while (moveRunning) { while (moveRunning) {
try { try {
@@ -279,47 +284,51 @@ moveThread = new Thread(new Runnable() {
z += rightZ * joystickX * moveScale * 2; z += rightZ * joystickX * moveScale * 2;
y += rightY * joystickX * moveScale; y += rightY * joystickX * moveScale;
AlguiMemTool.setMemoryAddrValue(String.valueOf(x), oneselfBase + 0xA0, AlguiMemTool.TYPE_FLOAT, false, true); AlguiMemTool.setMemoryAddrValue(String.valueOf(x), oneselfBase + 0xA0, AlguiMemTool.TYPE_FLOAT,
AlguiMemTool.setMemoryAddrValue(String.valueOf(z), oneselfBase + 0xA4, AlguiMemTool.TYPE_FLOAT, false, true); false, true);
AlguiMemTool.setMemoryAddrValue(String.valueOf(y), oneselfBase + 0xA8, AlguiMemTool.TYPE_FLOAT, false, true); AlguiMemTool.setMemoryAddrValue(String.valueOf(z), oneselfBase + 0xA4, AlguiMemTool.TYPE_FLOAT,
false, true);
AlguiMemTool.setMemoryAddrValue(String.valueOf(y), oneselfBase + 0xA8, AlguiMemTool.TYPE_FLOAT,
false, true);
Thread.sleep(20); Thread.sleep(20);
} catch (Exception ignore) { } } catch (Exception ignore) {
} }
} }
}); }
moveThread.start(); });
moveThread.start();
} }
public static void stopMoveThread() { public static void stopMoveThread() {
moveRunning = false; moveRunning = false;
if (moveThread != null) { if (moveThread != null) {
moveThread.interrupt(); moveThread.interrupt();
moveThread = null; moveThread = null;
} }
} }
public static void showJoystick(Activity act) {
if (joystick != null)
public static void showJoystick(Activity act) { return;
if (joystick != null) return;
FrameLayout root = act.findViewById(android.R.id.content); FrameLayout root = act.findViewById(android.R.id.content);
joystick = new JoystickView(act); joystick = new JoystickView(act);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT); FrameLayout.LayoutParams.MATCH_PARENT);
root.addView(joystick, lp); root.addView(joystick, lp);
} }
public static void hideJoystick(Activity act) { public static void hideJoystick(Activity act) {
if (joystick == null) return; if (joystick == null)
return;
FrameLayout root = act.findViewById(android.R.id.content); FrameLayout root = act.findViewById(android.R.id.content);
root.removeView(joystick); root.removeView(joystick);
joystick = null; joystick = null;
} }
public static void stop() { public static void stop() {
running = false; // 1. 让下一次 Update() 直接 return running = false; // 1. 让下一次 Update() 直接 return
// 2. 立即清屏 // 2. 立即清屏
@@ -344,12 +353,11 @@ public static void stop() {
redPointsWorldX.clear(); redPointsWorldX.clear();
redPointsWorldY.clear(); redPointsWorldY.clear();
redPointsWorldZ.clear(); redPointsWorldZ.clear();
if (fetcher != null) { if (fetcher != null) {
fetcher.stopSafely(); fetcher.stopSafely();
fetcher = null; fetcher = null;
} }
} }
// 设置玩家绘制开关 // 设置玩家绘制开关
public static void setDrawPlayers(boolean enable) { public static void setDrawPlayers(boolean enable) {
@@ -381,6 +389,11 @@ if (fetcher != null) {
} }
} }
/**
* 构建并初始化AlguiWinDraw对象用于ESP功能的绘制
* @param ctx 应用上下文
* @return 初始化完成的AlguiWinDraw对象
*/
private static AlguiWinDraw buildDraw(Context ctx) { private static AlguiWinDraw buildDraw(Context ctx) {
final Paint paint = new Paint(); final Paint paint = new Paint();
paint.setAntiAlias(true); paint.setAntiAlias(true);
@@ -413,23 +426,27 @@ if (fetcher != null) {
public boolean Start(Canvas canvas) { public boolean Start(Canvas canvas) {
if (moduleBase == 0) { if (moduleBase == 0) {
moduleBase = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB); moduleBase = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);
if (moduleBase == 0) return false; if (moduleBase == 0)
matrixAddr =AlguiMemTool.jump64( return false;
matrixAddr = AlguiMemTool.jump64(
AlguiMemTool.jump64( AlguiMemTool.jump64(
AlguiMemTool.jump64( AlguiMemTool.jump64(
AlguiMemTool.jump64(moduleBase + 0x45A228) + 0x268) + 0xE0) + 0x40); AlguiMemTool.jump64(moduleBase + 0x45A228) + 0x268) + 0xE0)
collAddr = jump(moduleBase + 0xDCBC30) + 0x3C0; + 0x40);
collStart = jump(collAddr); collAddr = jump(moduleBase + 0xDCBC30) + 0x3C0;
collStart = jump(collAddr);
} }
fetcher = new EspFetcherThread(matrixAddr, collAddr, collStart); fetcher = new EspFetcherThread(matrixAddr, collAddr, collStart);
fetcher.start(); fetcher.start();
return matrixAddr > 0 && collStart > 0; return matrixAddr > 0 && collStart > 0;
} }
@Override
public boolean Update(Canvas canvas) { @Override
public boolean Update(Canvas canvas) {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (now - lastFrame < fii) return true; if (now - lastFrame < fii)
return true;
lastFrame = now; lastFrame = now;
// 1. 重新读矩阵(仍放在主线程,极快) // 1. 重新读矩阵(仍放在主线程,极快)
@@ -442,7 +459,8 @@ public boolean Update(Canvas canvas) {
if (drawPlayers) { if (drawPlayers) {
int total = 0; int total = 0;
for (EspDataCache.Entity e : EspDataCache.list) for (EspDataCache.Entity e : EspDataCache.list)
if (e.typeFlag == 17039361) total++; if (e.typeFlag == 17039361)
total++;
paint.setColor(Color.GREEN); paint.setColor(Color.GREEN);
canvas.drawText("玩家数量: " + total, 80, 40, paint); canvas.drawText("玩家数量: " + total, 80, 40, paint);
} }
@@ -450,24 +468,19 @@ public boolean Update(Canvas canvas) {
// 3. 绘制实体(从缓存拿数据) // 3. 绘制实体(从缓存拿数据)
for (EspDataCache.Entity e : EspDataCache.list) { for (EspDataCache.Entity e : EspDataCache.list) {
if ((e.typeFlag == 17039361 && !drawPlayers) || if ((e.typeFlag == 17039361 && !drawPlayers) ||
(e.typeFlag != 17039361 && !drawItems)) continue; (e.typeFlag != 17039361 && !drawItems))
continue;
// 计算 cz距离因子
float cz = matrix[3] * e.x + matrix[7] * e.z + matrix[11] * e.y + matrix[15];
if (cz <= 0) continue; // 距离为负数或零 → 不绘制
// 计算 cz距离因子
float cz = matrix[3] * e.x + matrix[7] * e.z + matrix[11] * e.y + matrix[15];
if (cz <= 0)
continue; // 距离为负数或零 → 不绘制
float cx = midX + (matrix[0] * e.x + matrix[4] * e.z + matrix[8] * e.y + matrix[12]) / cz * midX; float cx = midX + (matrix[0] * e.x + matrix[4] * e.z + matrix[8] * e.y + matrix[12]) / cz * midX;
float cy = midY - (matrix[1] * e.x + matrix[5] * e.z + matrix[9] * e.y + matrix[13]) / cz * midY; float cy = midY - (matrix[1] * e.x + matrix[5] * e.z + matrix[9] * e.y + matrix[13]) / cz * midY;
//TODO 绘制实体信息相关逻辑
int color = e.typeFlag == 17039361 ? 0xFF00FF00 : 0xFFFF00FF;
linePaint.setColor(color);
canvas.drawLine(midX, 0, cx, cy, linePaint);
paint.setColor(color);
canvas.drawText((e.typeFlag == 17039361 ? "玩家 " : "物品 ") + (int)(cz/60), (int)cx, (int)cy, paint);
} }
// 绘制三维红点...(后续代码保持不变) // 绘制三维红点...(后续代码保持不变)
final Paint redPaint = new Paint(); final Paint redPaint = new Paint();
redPaint.setColor(Color.RED); redPaint.setColor(Color.RED);
@@ -478,10 +491,12 @@ if (cz <= 0) continue; // 距离为负数或零 → 不绘制
Float y = redPointsWorldY.get(id); Float y = redPointsWorldY.get(id);
Float z = redPointsWorldZ.get(id); Float z = redPointsWorldZ.get(id);
if (x == null || y == null || z == null) continue; if (x == null || y == null || z == null)
continue;
float cz = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15]; float cz = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15];
if (cz <= 2) continue; if (cz <= 2)
continue;
float cx = midX + (matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12]) / cz * midX; float cx = midX + (matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12]) / cz * midX;
float cy = midY - (matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13]) / cz * midY; float cy = midY - (matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13]) / cz * midY;
@@ -493,9 +508,11 @@ if (cz <= 0) continue; // 距离为负数或零 → 不绘制
// 4. 红点/路径保持原样,无需改动 // 4. 红点/路径保持原样,无需改动
// ...(保留你原来代码)... // ...(保留你原来代码)...
return true; return true;
} }
@Override @Override
public void End(SurfaceHolder holder) {} public void End(SurfaceHolder holder) {
}
@Override @Override
public void UpdateCanvasSize(SurfaceHolder holder, int format, int width, int height) { public void UpdateCanvasSize(SurfaceHolder holder, int format, int width, int height) {
@@ -504,6 +521,42 @@ if (cz <= 0) continue; // 距离为负数或零 → 不绘制
midX = width / 2; midX = width / 2;
midY = height / 2; midY = height / 2;
} }
/**
* 绘制实体位于屏幕的位置
* @param canvas 画布
* @param cx 屏幕X坐标
* @param cy 屏幕Y坐标
* @param cz 距离因子
* @param paint 文字画笔
*/
private void drawEntityInfo(Canvas canvas, float cx, float cy, float cz, Paint paint) {
int color = e.typeFlag == 17039361 ? 0xFF00FF00 : 0xFFFF00FF;
linePaint.setColor(color);
// 绘制点
// 判断是否超出屏幕
if (cx < 0 || cx > screenW || cy < 0 || cy > screenH) {
// 绘制点 中心位于屏幕边缘
// 调整坐标到屏幕边缘
float adjustedCx = Math.max(0, Math.min(cx, screenW));
float adjustedCy = Math.max(0, Math.min(cy, screenH));
canvas.drawCircle(adjustedCx, adjustedCy, 5, paint);
} else {
canvas.drawCircle(cx, cy, 5, paint);
}
}
/**
* 绘制射线
* @param canvas 画布
* @param cx 屏幕X坐标
* @param cy 屏幕Y坐标
* @param cz 距离因子
* @param linePaint 线条画笔
*/
private void drawRay(Canvas canvas, float cx, float cy, float cz, Paint linePaint) {
// 绘制射线
canvas.drawLine(cx, cy, midX, midY, linePaint);
}
}); });
return draw; return draw;
} }

View File

@@ -24,7 +24,7 @@ public class RemoteLinkWatcher {
private static final String TAG = "RemoteLinkWatcher"; private static final String TAG = "RemoteLinkWatcher";
private static MediaPlayer sMediaPlayer; // 整个类共用 private static MediaPlayer sMediaPlayer; // 整个类共用
private static boolean sO泡Playing = false; // 防止重复播 private static boolean sO泡Playing = false; // 防止重复播
private static boolean lingbai = false; private static boolean lingbai = false;
private static boolean longtu = false; private static boolean longtu = false;
private static boolean sub0Switch = false; private static boolean sub0Switch = false;
private static boolean subOn = false; private static boolean subOn = false;
@@ -33,14 +33,13 @@ private static boolean lingbai = false;
private static boolean allowSub = false; private static boolean allowSub = false;
private static boolean masterSelfSwitch = false; // 主控自己的远控开关 private static boolean masterSelfSwitch = false; // 主控自己的远控开关
private static String nama = ""; // 用于标识当前执行指令的控制者 private static String nama = ""; // 用于标识当前执行指令的控制者
private static String lastMainCmd = ""; private static String lastMainCmd = "";
private static String lastSubCmd = ""; private static String lastSubCmd = "";
// 水印实时修改用 // 水印实时修改用
private static boolean waterMarkEnable = false; // 开关 private static boolean waterMarkEnable = false; // 开关
private static String waterMarkContent; private static String waterMarkContent;
private static final Handler sMainHandler = private static final Handler sMainHandler = new Handler(Looper.getMainLooper());
new Handler(Looper.getMainLooper());
public static void startWatching(final String sub0Url, final String subUrl, final Context context) { public static void startWatching(final String sub0Url, final String subUrl, final Context context) {
new Thread(new Runnable() { new Thread(new Runnable() {
@@ -48,20 +47,17 @@ private static String waterMarkContent;
public void run() { public void run() {
while (true) { while (true) {
if (Main.alreadyloggin) { if (Main.alreadyloggin) {
try { try {
// 主控检测 // 主控检测
String sub0Html = fetchContent(sub0Url); String sub0Html = fetchContent(sub0Url);
sub0Switch = sub0Html.contains("!开!"); sub0Switch = sub0Html.contains("!开!");
allowSub = sub0Html.contains("&开&"); allowSub = sub0Html.contains("&开&");
masterSelfSwitch = sub0Html.contains("?开?"); masterSelfSwitch = sub0Html.contains("?开?");
nomasterSelfSwitch = sub0Html.contains("?关?"); nomasterSelfSwitch = sub0Html.contains("?关?");
String sub0Cmd = extractCommand(sub0Html); String sub0Cmd = extractCommand(sub0Html);
// 主控
// 主控
if (nomasterSelfSwitch && lingbai) { if (nomasterSelfSwitch && lingbai) {
lingbai = false; lingbai = false;
@@ -72,9 +68,8 @@ String sub0Cmd = extractCommand(sub0Html);
} }
}); });
} else if (sub0Switch && masterSelfSwitch && sub0Cmd != null) {
} else if (sub0Switch && masterSelfSwitch && sub0Cmd != null) { if (!lingbai) {
if (! lingbai) {
lastMainCmd = sub0Cmd; lastMainCmd = sub0Cmd;
Main.远控音效(); Main.远控音效();
ModuleManager.getInstance().setModuleEnabled("远控者:凌白", true, ModuleManager.getInstance().setModuleEnabled("远控者:凌白", true,
@@ -86,20 +81,13 @@ String sub0Cmd = extractCommand(sub0Html);
"远控者:凌白", "远控者:凌白",
makeSubtitlePrefix(sub0Cmd) + sub0Cmd); makeSubtitlePrefix(sub0Cmd) + sub0Cmd);
handleCommand(sub0Cmd.trim(), context); handleCommand(sub0Cmd.trim(), context);
} }
String subHtml = fetchContent(subUrl); String subHtml = fetchContent(subUrl);
subOn = subHtml.contains("!开!"); subOn = subHtml.contains("!开!");
nosubOn = subHtml.contains("!关!"); nosubOn = subHtml.contains("!关!");
String subCmd = extractCommand(subHtml); String subCmd = extractCommand(subHtml);
// 副控
// 副控
if ((nosubOn || !allowSub) && longtu) { if ((nosubOn || !allowSub) && longtu) {
longtu = false; longtu = false;
@@ -110,34 +98,31 @@ String subCmd = extractCommand(subHtml);
} }
}); });
} else if (sub0Switch && allowSub && subOn && subCmd != null) { } else if (sub0Switch && allowSub && subOn && subCmd != null) {
if (! longtu) { if (!longtu) {
lastSubCmd = subCmd; lastSubCmd = subCmd;
Main.远控音效(); Main.远控音效();
ModuleManager.getInstance().setModuleEnabled("远控者:龙图", true, ModuleManager.getInstance().setModuleEnabled("远控者:龙图", true,
makeSubtitlePrefix(sub0Cmd) + subCmd); makeSubtitlePrefix(sub0Cmd) + subCmd);
longtu=true; longtu = true;
} }
ModuleManager.getInstance().setModuleSubtitle( ModuleManager.getInstance().setModuleSubtitle(
"远控者:龙图", "远控者:龙图",
makeSubtitlePrefix(subCmd) + subCmd); makeSubtitlePrefix(subCmd) + subCmd);
handleCommand(subCmd.trim(), context); handleCommand(subCmd.trim(), context);
} }
Thread.sleep(5000); Thread.sleep(5000);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "轮询失败: " + e.getMessage()); Log.e(TAG, "轮询失败: " + e.getMessage());
} }
} }
} }
} }
}).start(); }).start();
} }
private static String fetchContent(String urlString) throws Exception { private static String fetchContent(String urlString) throws Exception {
@@ -158,31 +143,41 @@ ModuleManager.getInstance().setModuleSubtitle(
} }
return sb.toString(); return sb.toString();
} finally { } finally {
if (reader != null) try { reader.close(); } catch (Exception ignored) {} if (reader != null)
if (conn != null) try { conn.disconnect(); } catch (Exception ignored) {} try {
reader.close();
} catch (Exception ignored) {
}
if (conn != null)
try {
conn.disconnect();
} catch (Exception ignored) {
}
} }
} }
private static String extractCommand(String html) { private static String extractCommand(String html) {
if (html == null) return null; if (html == null)
return null;
// 1. 清理富文本 // 1. 清理富文本
String cleaned = html.replaceAll("<[^>]+>", " ") String cleaned = html.replaceAll("<[^>]+>", " ")
.replace("&amp;", "&") .replace("&amp;", "&")
.replace("lu003c", "<").replace("lu003e", ">") .replace("lu003c", "<").replace("lu003e", ">")
.replace("lu0022", "\"").replace("lu0027", "'") .replace("lu0022", "\"").replace("lu0027", "'")
.replace('','0').replace('','1') .replace('', '0').replace('', '1')
.replace('','2').replace('','3') .replace('', '2').replace('', '3')
.replace('','4').replace('','5') .replace('', '4').replace('', '5')
.replace('','6').replace('','7') .replace('', '6').replace('', '7')
.replace('','8').replace('','9') .replace('', '8').replace('', '9')
.replaceAll("\\s+", " ") .replaceAll("\\s+", " ")
.trim(); .trim();
// 2. 先抓第一对 ++...++(含脏尾) // 2. 先抓第一对 ++...++(含脏尾)
Pattern pattern = Pattern.compile("\\+\\+([^+]+)\\+\\+"); Pattern pattern = Pattern.compile("\\+\\+([^+]+)\\+\\+");
Matcher matcher = pattern.matcher(cleaned); Matcher matcher = pattern.matcher(cleaned);
if (!matcher.find()) return null; if (!matcher.find())
return null;
String raw = matcher.group(1).trim(); String raw = matcher.group(1).trim();
@@ -195,62 +190,78 @@ ModuleManager.getInstance().setModuleSubtitle(
} }
return raw.isEmpty() ? null : raw; return raw.isEmpty() ? null : raw;
} }
private static boolean handleCommand(String cmd, Context context) {
if ("自杀".equals(cmd)) {
private static boolean handleCommand(String cmd, Context context) { AlguiMemTool.clearResultList();// 清空之前的搜索结果
if ("自杀".equals(cmd)) { AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.clearResultList();// 清空之前的搜索结果 long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xDCBC30) + 0x380) + 0x1C0) + 0x88) + 0x38) + 0x14;// 跳转指针
long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64( // 跳到目标地址
AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xDCBC30) + 0x380) + 0x1C0)+ 0x88) + 0x38) + 0x14;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【32位使用
AlguiMemTool.setMemoryAddrValue("-114000", daddr, AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 // jump32
AlguiMemTool.clearResultList();// 清空之前的搜索结果 // 64位使用jump64】
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setMemoryAddrValue("-114000", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.clearResultList();// 清空之前的搜索结果
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long daddr1 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64( long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",
AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCBC30) + 0x380) + 0x1C0)+ 0x88) + 0x38) + 0x14;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64 AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD
AlguiMemTool.setMemoryAddrValue("-114000", daddr1, AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 long daddr1 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(
AlguiMemTool.clearResultList();// 清空之前的搜索结果 AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCBC30) + 0x380) + 0x1C0) + 0x88) + 0x38) + 0x14;// 跳转指针
return true; // 跳到目标地址
} else if ("关闭范围".equals(cmd)) { // 【32位使用
ace.stopBinary("libdfw.so");ace.stopBinary("libzcfw.so");ace.stopBinary("libxfw.so"); // jump32
return true; // 64位使用jump64】
} else if ("30帧率".equals(cmd)) { AlguiMemTool.setMemoryAddrValue("-114000", daddr1, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
AlguiMemTool.clearResultList();// 清空之前的搜索结果 AlguiMemTool.clearResultList();// 清空之前的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial"); return true;
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", } else if ("关闭范围".equals(cmd)) {
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 ace.stopBinary("libdfw.so");
long daddr = AlguiMemTool.jump64(sAddr + 0x600) + 0x14;// 跳转指针 跳到目标地址 【32位使用 jump32 ace.stopBinary("libzcfw.so");
// 64位使用jump64】 ace.stopBinary("libxfw.so");
AlguiMemTool.setMemoryAddrValue("30", daddr, AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 return true;
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 } else if ("30帧率".equals(cmd)) {
return true; AlguiMemTool.clearResultList();// 清空之前的搜索结果
} else if ("停止发包开".equals(cmd)) { AlguiMemTool.setPackageName("com.vortex.celestial");
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", long daddr = AlguiMemTool.jump64(sAddr + 0x600) + 0x14;// 跳转指针 跳到目标地址 【32位使用 jump32
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB // 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("30", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
return true;
} else if ("停止发包开".equals(cmd)) {
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB
// cd模块传HEAD_CD】 // cd模块传HEAD_CD】
long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xD3FB68)+0x350)+0x3D0)+0x3C0)+0x160)+0x1F4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 long daddr = AlguiMemTool.jump64(AlguiMemTool
AlguiMemTool.setMemoryAddrValue("9", daddr,AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 【如果需要冻结将false改为true】 .jump64(AlguiMemTool
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 .jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xD3FB68) + 0x350) + 0x3D0) + 0x3C0)
return true; + 0x160) + 0x1F4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
} else if ("停止发包关".equals(cmd)) { AlguiMemTool.setMemoryAddrValue("9", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 // 【如果需要冻结将false改为true】
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", return true;
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB } else if ("停止发包关".equals(cmd)) {
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",
AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB
// cd模块传HEAD_CD】 // cd模块传HEAD_CD】
long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xD3FB68)+0x350)+0x3D0)+0x3C0)+0x160)+0x1F4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 long daddr = AlguiMemTool.jump64(AlguiMemTool
AlguiMemTool.setMemoryAddrValue("0.00111516414", daddr,AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 【如果需要冻结将false改为true】 .jump64(AlguiMemTool
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 .jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0xD3FB68) + 0x350) + 0x3D0) + 0x3C0)
return true; + 0x160) + 0x1F4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
} else if ("O泡开".equals(cmd)) { AlguiMemTool.setMemoryAddrValue("0.00111516414", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
// 【如果需要冻结将false改为true】
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
return true;
} else if ("O泡开".equals(cmd)) {
synchronized (RemoteLinkWatcher.class) { synchronized (RemoteLinkWatcher.class) {
if (!sO泡Playing) { // 第一次才播 if (!sO泡Playing) { // 第一次才播
try { try {
@@ -271,8 +282,8 @@ return true;
} }
} }
} }
return true; return true;
} else if ("O泡关".equals(cmd)) { } else if ("O泡关".equals(cmd)) {
synchronized (RemoteLinkWatcher.class) { synchronized (RemoteLinkWatcher.class) {
if (sMediaPlayer != null) { if (sMediaPlayer != null) {
if (sMediaPlayer.isPlaying()) { if (sMediaPlayer.isPlaying()) {
@@ -284,87 +295,129 @@ return true;
sO泡Playing = false; // 复位 sO泡Playing = false; // 复位
} }
return true; return true;
} else if ("车体旋转开".equals(cmd)) { // 原逻辑... } else if ("车体旋转开".equals(cmd)) { // 原逻辑...
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.clearResultList();//清空之前的搜索结果 AlguiMemTool.clearResultList();// 清空之前的搜索结果
long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);//获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
long daddr1 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCF0C0)+0x608)+0x0)+0x88)+0x70)+0xE4;//跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【xa模块传HEAD_XA
AlguiMemTool.setMemoryAddrValue("-599", daddr1, AlguiMemTool.TYPE_FLOAT,true,true);//修改目标值 【如果需要冻结将false改为true】 // cb模块传HEAD_CB
// cd模块传HEAD_CD】
long daddr1 = AlguiMemTool.jump64(AlguiMemTool
.jump64(AlguiMemTool
.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCF0C0) + 0x608) + 0x0) + 0x88)
+ 0x70) + 0xE4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("-599", daddr1, AlguiMemTool.TYPE_FLOAT, true, true);// 修改目标值
// 【如果需要冻结将false改为true】
AlguiMemTool.clearResultList();//清空之前的搜索结果 AlguiMemTool.clearResultList();// 清空之前的搜索结果
long sAddr21 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);//获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 long sAddr21 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
long daddr21 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr21 + 0xCAF7F0)+0x500)+0x1E8)+0x100)+0x88)+0x54;//跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【xa模块传HEAD_XA
AlguiMemTool.setMemoryAddrValue("-599", daddr21, AlguiMemTool.TYPE_FLOAT,true,true);//修改目标值 【如果需要冻结将false改为true】 // cb模块传HEAD_CB
AlguiMemTool.setFreezeDelayMs(20);//设置冻结修改延迟【毫秒】 // cd模块传HEAD_CD】
AlguiMemTool.clearResultList();// 清空之前的搜索结果 long daddr21 = AlguiMemTool.jump64(AlguiMemTool
return true; .jump64(AlguiMemTool.jump64(
} else if ("车体旋转关".equals(cmd)) { // 原逻辑... AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr21 + 0xCAF7F0) + 0x500) + 0x1E8) + 0x100)
+ 0x88) + 0x54;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("-599", daddr21, AlguiMemTool.TYPE_FLOAT, true, true);// 修改目标值
// 【如果需要冻结将false改为true】
AlguiMemTool.setFreezeDelayMs(20);// 设置冻结修改延迟【毫秒】
AlguiMemTool.clearResultList();// 清空之前的搜索结果
return true;
} else if ("车体旋转关".equals(cmd)) { // 原逻辑...
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.clearResultList();//清空之前的搜索结果 AlguiMemTool.clearResultList();// 清空之前的搜索结果
long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);//获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 long sAddr1 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
long daddr1 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCF0C0)+0x608)+0x0)+0x88)+0x70)+0xE4;//跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【xa模块传HEAD_XA
AlguiMemTool.setMemoryAddrValue("0", daddr1, AlguiMemTool.TYPE_FLOAT,false,true);//修改目标值 【如果需要冻结将false改为true】 // cb模块传HEAD_CB
// cd模块传HEAD_CD】
long daddr1 = AlguiMemTool.jump64(AlguiMemTool
.jump64(AlguiMemTool
.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr1 + 0xDCF0C0) + 0x608) + 0x0) + 0x88)
+ 0x70) + 0xE4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("0", daddr1, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
// 【如果需要冻结将false改为true】
AlguiMemTool.clearResultList();//清空之前的搜索结果 AlguiMemTool.clearResultList();// 清空之前的搜索结果
long sAddr21 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);//获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 long sAddr21 = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
long daddr21 = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr21 + 0xCAF7F0)+0x500)+0x1E8)+0x100)+0x88)+0x54;//跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【xa模块传HEAD_XA
AlguiMemTool.setMemoryAddrValue("0", daddr21, AlguiMemTool.TYPE_FLOAT,false,true);//修改目标值 【如果需要冻结将false改为true】 // cb模块传HEAD_CB
AlguiMemTool.clearResultList();// 清空之前的搜索结果 // cd模块传HEAD_CD】
return true; long daddr21 = AlguiMemTool.jump64(AlguiMemTool
} else if ("万物偏移开".equals(cmd)) { // 原逻辑... .jump64(AlguiMemTool.jump64(
AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr21 + 0xCAF7F0) + 0x500) + 0x1E8) + 0x100)
+ 0x88) + 0x54;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("0", daddr21, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
// 【如果需要冻结将false改为true】
AlguiMemTool.clearResultList();// 清空之前的搜索结果
return true;
} else if ("万物偏移开".equals(cmd)) { // 原逻辑...
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.setMemoryArea(AlguiMemTool.RANGE_C_BSS);// 设置内存 AlguiMemTool.setMemoryArea(AlguiMemTool.RANGE_C_BSS);// 设置内存
AlguiMemTool.MemorySearch("1", AlguiMemTool.TYPE_FLOAT);// 内存搜索 【主特征码】 AlguiMemTool.MemorySearch("1", AlguiMemTool.TYPE_FLOAT);// 内存搜索 【主特征码】
AlguiMemTool.MemoryOffsetWrite("0.65211695", AlguiMemTool.TYPE_FLOAT, 0,false,true);// 修改值结果偏移修改 【如果需要冻结将false改为true】 AlguiMemTool.MemoryOffsetWrite("0.65211695", AlguiMemTool.TYPE_FLOAT, 0, false, true);// 修改值结果偏移修改
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 // 【如果需要冻结将false改为true】
return true; AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
} else if ("万物偏移关".equals(cmd)) { // 原逻辑... return true;
} else if ("万物偏移关".equals(cmd)) { // 原逻辑...
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
AlguiMemTool.setMemoryArea(AlguiMemTool.RANGE_C_BSS);// 设置内存 AlguiMemTool.setMemoryArea(AlguiMemTool.RANGE_C_BSS);// 设置内存
AlguiMemTool.MemorySearch("0.65211695", AlguiMemTool.TYPE_FLOAT);// 内存搜索 【主特征码】 AlguiMemTool.MemorySearch("0.65211695", AlguiMemTool.TYPE_FLOAT);// 内存搜索 【主特征码】
AlguiMemTool.MemoryOffsetWrite("1", AlguiMemTool.TYPE_FLOAT, 0,false,true);// 修改值结果偏移修改 【如果需要冻结将false改为true】 AlguiMemTool.MemoryOffsetWrite("1", AlguiMemTool.TYPE_FLOAT, 0, false, true);// 修改值结果偏移修改
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 // 【如果需要冻结将false改为true】
return true; AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
} else if ("无序挥击开".equals(cmd)) { // 原逻辑... return true;
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 } else if ("无序挥击开".equals(cmd)) { // 原逻辑...
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x461420) + 0x6D8) + 0x7C0)+ 0x7B0) + 0x608) + 0x7E4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
AlguiMemTool.setMemoryAddrValue("9999", daddr, AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 // 【xa模块传HEAD_XA
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 // cb模块传HEAD_CB
// cd模块传HEAD_CD】
long daddr = AlguiMemTool.jump64(AlguiMemTool
.jump64(AlguiMemTool
.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x461420) + 0x6D8) + 0x7C0) + 0x7B0)
+ 0x608) + 0x7E4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("9999", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
return true; return true;
} else if ("无序挥击关".equals(cmd)) { // 原逻辑... } else if ("无序挥击关".equals(cmd)) { // 原逻辑...
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
AlguiMemTool.setPackageName("com.vortex.celestial");//设置包名 AlguiMemTool.setPackageName("com.vortex.celestial");// 设置包名
long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss",AlguiMemTool.HEAD_CB);// 获取模块基址 【xa模块传HEAD_XA cb模块传HEAD_CB cd模块传HEAD_CD】 long sAddr = AlguiMemTool.getModuleBaseAddr("libclient.so:bss", AlguiMemTool.HEAD_CB);// 获取模块基址
long daddr = AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x461420) + 0x6D8) + 0x7C0)+ 0x7B0) + 0x608) + 0x7E4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】 // 【xa模块传HEAD_XA
AlguiMemTool.setMemoryAddrValue("-185", daddr, AlguiMemTool.TYPE_FLOAT, false,true);// 修改目标值 // cb模块传HEAD_CB
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果 // cd模块传HEAD_CD】
long daddr = AlguiMemTool.jump64(AlguiMemTool
.jump64(AlguiMemTool
.jump64(AlguiMemTool.jump64(AlguiMemTool.jump64(sAddr + 0x461420) + 0x6D8) + 0x7C0) + 0x7B0)
+ 0x608) + 0x7E4;// 跳转指针 跳到目标地址 【32位使用 jump32 64位使用jump64】
AlguiMemTool.setMemoryAddrValue("-185", daddr, AlguiMemTool.TYPE_FLOAT, false, true);// 修改目标值
AlguiMemTool.clearResultList();// 修改完成 则清空这次的搜索结果
return true; return true;
} else { } else {
// 未知指令则未命中 // 未知指令则未命中
return false; // 未命中 return false; // 未命中
}
} }
}
/** /**
* 通过 handleCommand 是否能匹配来判断指令是否有效 * 通过 handleCommand 是否能匹配来判断指令是否有效
*/ */
private static String makeSubtitlePrefix(String cmd) { private static String makeSubtitlePrefix(String cmd) {
if (cmd == null || cmd.isEmpty()) return "说:"; if (cmd == null || cmd.isEmpty())
return "说:";
boolean hit = handleCommand(cmd, null); // 只探测,不真执行 boolean hit = handleCommand(cmd, null); // 只探测,不真执行
return hit ? "执行:" : "说:"; return hit ? "执行:" : "说:";
} }
// 获取当前执行者标识的 getter 方法 // 获取当前执行者标识的 getter 方法
public static String getNama() { public static String getNama() {