diff options
Diffstat (limited to '')
| -rw-r--r-- | src/hl2h.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/hl2h.cpp b/src/hl2h.cpp index 1460577..c51d35e 100644 --- a/src/hl2h.cpp +++ b/src/hl2h.cpp | |||
| @@ -467,7 +467,8 @@ static void hkdSrvRandomSeed(int seed) { | |||
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | static void install_seed_hook() { | 469 | static void install_seed_hook() { |
| 470 | if (g_seed_hook_installed || !g_server.valid()) | 470 | static bool failed = false; |
| 471 | if (g_seed_hook_installed || failed || !g_server.valid()) | ||
| 471 | return; | 472 | return; |
| 472 | g_srv_base = g_server.ranges[0].lo; | 473 | g_srv_base = g_server.ranges[0].lo; |
| 473 | uintptr_t slot = g_srv_base + 0xce1348; // R_386_JUMP_SLOT RandomSeed | 474 | uintptr_t slot = g_srv_base + 0xce1348; // R_386_JUMP_SLOT RandomSeed |
| @@ -478,7 +479,9 @@ static void install_seed_hook() { | |||
| 478 | if (!g_real_random_seed) | 479 | if (!g_real_random_seed) |
| 479 | g_real_random_seed = (void (*)(int))dlsym(RTLD_DEFAULT, "RandomSeed"); | 480 | g_real_random_seed = (void (*)(int))dlsym(RTLD_DEFAULT, "RandomSeed"); |
| 480 | if (!g_real_random_seed) { | 481 | if (!g_real_random_seed) { |
| 482 | failed = true; | ||
| 481 | logf("seed hook: real RandomSeed not found"); | 483 | logf("seed hook: real RandomSeed not found"); |
| 484 | toastf(TOAST_WARN, "Spread seed hook unavailable"); | ||
| 482 | return; | 485 | return; |
| 483 | } | 486 | } |
| 484 | mprotect((void *)(slot & ~(uintptr_t)0xFFF), 0x1000, | 487 | mprotect((void *)(slot & ~(uintptr_t)0xFFF), 0x1000, |
| @@ -808,6 +811,7 @@ static void *setup_thread(void *) { | |||
| 808 | } | 811 | } |
| 809 | if (!g_client.valid() || !g_engine.valid()) { | 812 | if (!g_client.valid() || !g_engine.valid()) { |
| 810 | logf("client.so/engine.so never appeared"); | 813 | logf("client.so/engine.so never appeared"); |
| 814 | toastf(TOAST_ERROR, "client.so/engine.so not found; hl2hake inactive"); | ||
| 811 | return nullptr; | 815 | return nullptr; |
| 812 | } | 816 | } |
| 813 | logf("client.so: %d mapped range(s), %s", (int)g_client.ranges.size(), | 817 | logf("client.so: %d mapped range(s), %s", (int)g_client.ranges.size(), |
| @@ -822,6 +826,7 @@ static void *setup_thread(void *) { | |||
| 822 | auto ef = (CreateInterfaceFn)dlsym(eh, "CreateInterface"); | 826 | auto ef = (CreateInterfaceFn)dlsym(eh, "CreateInterface"); |
| 823 | if (!cf || !ef) { | 827 | if (!cf || !ef) { |
| 824 | logf("CreateInterface not found"); | 828 | logf("CreateInterface not found"); |
| 829 | toastf(TOAST_ERROR, "CreateInterface not found; hl2hake inactive"); | ||
| 825 | return nullptr; | 830 | return nullptr; |
| 826 | } | 831 | } |
| 827 | 832 | ||
| @@ -840,6 +845,7 @@ static void *setup_thread(void *) { | |||
| 840 | logf("interfaces unresolved: VClient017=%p VClientEntityList003=%p " | 845 | logf("interfaces unresolved: VClient017=%p VClientEntityList003=%p " |
| 841 | "VEngineClient014=%p", | 846 | "VEngineClient014=%p", |
| 842 | g_iface.client, g_iface.entitylist, g_iface.engine); | 847 | g_iface.client, g_iface.entitylist, g_iface.engine); |
| 848 | toastf(TOAST_ERROR, "Game interfaces unresolved; hl2hake inactive"); | ||
| 843 | return nullptr; | 849 | return nullptr; |
| 844 | } | 850 | } |
| 845 | logf("interfaces: VClient017=%p VClientEntityList003=%p " | 851 | logf("interfaces: VClient017=%p VClientEntityList003=%p " |
| @@ -856,12 +862,27 @@ static void *setup_thread(void *) { | |||
| 856 | g_iface.engineserver, g_iface.debugoverlay, g_iface.enginetrace); | 862 | g_iface.engineserver, g_iface.debugoverlay, g_iface.enginetrace); |
| 857 | 863 | ||
| 858 | resolve_netvars(); | 864 | resolve_netvars(); |
| 859 | if (!find_input_global()) | 865 | if (!g_net.ok()) |
| 866 | toastf(TOAST_ERROR, "Netvars incomplete; features may be disabled"); | ||
| 867 | else if (g_net.absvelocity < 0) | ||
| 868 | toastf(TOAST_WARN, "Jumpbug assist disabled: velocity netvar missing"); | ||
| 869 | if (!g_iface.engineserver) | ||
| 870 | toastf(TOAST_WARN, "Server interfaces missing; jumpbug/spread limited"); | ||
| 871 | if (!g_iface.debugoverlay) | ||
| 872 | toastf(TOAST_WARN, "Debug overlay missing; ESP projection uses fallback"); | ||
| 873 | if (!g_iface.enginetrace) | ||
| 874 | toastf(TOAST_WARN, "Engine trace missing; vischeck fails open"); | ||
| 875 | |||
| 876 | if (!find_input_global()) { | ||
| 877 | toastf(TOAST_ERROR, "Input hook failed; movement features disabled"); | ||
| 860 | return nullptr; | 878 | return nullptr; |
| 879 | } | ||
| 861 | 880 | ||
| 862 | init_conmsg(); | 881 | init_conmsg(); |
| 863 | install_hook(); | 882 | install_hook(); |
| 864 | install_menu(); | 883 | install_menu(); |
| 884 | if (g_surface) | ||
| 885 | toastf(TOAST_INFO, "hl2hake loaded - Insert opens the menu"); | ||
| 865 | return nullptr; | 886 | return nullptr; |
| 866 | } | 887 | } |
| 867 | 888 | ||
