diff --git a/src/main/java/com/github/manolo8/darkbot/core/api/Utils.java b/src/main/java/com/github/manolo8/darkbot/core/api/Utils.java index bc68f4a68..336602d79 100644 --- a/src/main/java/com/github/manolo8/darkbot/core/api/Utils.java +++ b/src/main/java/com/github/manolo8/darkbot/core/api/Utils.java @@ -9,6 +9,7 @@ import com.github.manolo8.darkbot.utils.MathUtils; import java.util.Set; +import java.util.concurrent.CompletableFuture; public class Utils { public static final String SELECT_MAP_ASSET = "MapAssetNotificationTRY_TO_SELECT_MAPASSET"; @@ -98,6 +99,31 @@ else if (ret == 0) { return true; } + + default CompletableFuture scanMethodSignature(boolean checkName, String signature, int index, long object) { + return CompletableFuture.runAsync(() -> { + if (!ByteUtils.isValidPtr(object)) { + System.out.println("[SignatureScan] invalid object for signature: " + signature); + return; + } + + int scanWindow = 20; + int fromIndex = Math.max(0, index - scanWindow); + int toIndex = index + scanWindow; + + boolean found = false; + for (int idx = fromIndex; idx <= toIndex; idx++) { + int result = checkMethodSignature(object, idx, checkName, signature); + if (result == 1) { + found = true; + System.out.println("[SignatureScan] match at index " + idx + ": " + signature); + } + } + if (!found) { + System.out.println("[SignatureScan] no match in range " + fromIndex + ".." + toIndex + ": " + signature); + } + }); + } } } diff --git a/src/main/java/com/github/manolo8/darkbot/core/api/adapters/KekkaPlayerAdapter.java b/src/main/java/com/github/manolo8/darkbot/core/api/adapters/KekkaPlayerAdapter.java index 799b741c6..3c2170b08 100644 --- a/src/main/java/com/github/manolo8/darkbot/core/api/adapters/KekkaPlayerAdapter.java +++ b/src/main/java/com/github/manolo8/darkbot/core/api/adapters/KekkaPlayerAdapter.java @@ -4,6 +4,7 @@ import com.github.manolo8.darkbot.core.BotInstaller; import com.github.manolo8.darkbot.core.api.Capability; import com.github.manolo8.darkbot.core.api.GameAPIImpl; +import com.github.manolo8.darkbot.core.api.InvalidNativeSignature; import com.github.manolo8.darkbot.core.api.Utils; import com.github.manolo8.darkbot.core.entities.Box; import com.github.manolo8.darkbot.core.entities.Entity; @@ -159,8 +160,13 @@ public void setMaxFps(int maxFps) { @Override public boolean callMethodChecked(boolean checkName, String signature, int index, long... arguments) { - if (checkSignature(checkName, signature, index, arguments[0])) - return callMethodAsync(index, arguments); + try { + if (checkSignature(checkName, signature, index, arguments[0])) + return callMethodAsync(index, arguments); + } catch (InvalidNativeSignature e) { + scanMethodSignature(checkName, signature, index, arguments[0]); + throw e; + } return false; } diff --git a/src/main/java/com/github/manolo8/darkbot/core/api/adapters/TanosAdapter.java b/src/main/java/com/github/manolo8/darkbot/core/api/adapters/TanosAdapter.java index 6c5b5facd..105d7ca35 100644 --- a/src/main/java/com/github/manolo8/darkbot/core/api/adapters/TanosAdapter.java +++ b/src/main/java/com/github/manolo8/darkbot/core/api/adapters/TanosAdapter.java @@ -4,6 +4,7 @@ import com.github.manolo8.darkbot.core.BotInstaller; import com.github.manolo8.darkbot.core.api.Capability; import com.github.manolo8.darkbot.core.api.GameAPIImpl; +import com.github.manolo8.darkbot.core.api.InvalidNativeSignature; import com.github.manolo8.darkbot.core.api.Utils; import com.github.manolo8.darkbot.core.entities.Box; import com.github.manolo8.darkbot.core.entities.Entity; @@ -79,9 +80,14 @@ public Set signatureCache() { @Override public boolean callMethodChecked(boolean checkName, String signature, int index, long... arguments) { - if (checkSignature(checkName, signature, index, arguments[0])) { - callMethod(index, arguments); - return true; + try { + if (checkSignature(checkName, signature, index, arguments[0])) { + callMethod(index, arguments); + return true; + } + } catch (InvalidNativeSignature e) { + scanMethodSignature(checkName, signature, index, arguments[0]); + throw e; } return false; }