From 0e64c1e02407c0eea58b27d2b42915d1768d2a3a Mon Sep 17 00:00:00 2001 From: nullifiedcat Date: Mon, 24 Jul 2017 11:05:32 +0300 Subject: [PATCH] fix compile errors (non-trivial Vector in union) --- src/hacks/Walkbot.cpp | 96 ++++++++++++++++++++++++++++++++----------- src/hacks/hacklist.h | 1 + 2 files changed, 74 insertions(+), 23 deletions(-) diff --git a/src/hacks/Walkbot.cpp b/src/hacks/Walkbot.cpp index 19c4a93e..3c4beb03 100644 --- a/src/hacks/Walkbot.cpp +++ b/src/hacks/Walkbot.cpp @@ -33,19 +33,20 @@ struct walkbot_header_s { }; struct walkbot_node_s { - union { - struct { - float x { 0.0f }; // 4 - float y { 0.0f }; // 8 - float z { 0.0f }; // 12 - }; - Vector xyz { 0, 0, 0 }; // 12 + struct { + float x { 0 }; // 4 + float y { 0 }; // 8 + float z { 0 }; // 12 }; unsigned flags { 0 }; // 16 size_t connection_count { 0 }; // 20 index_t connections[MAX_CONNECTIONS]; // 36 index_t preferred { INVALID_NODE }; // 40 + Vector& xyz() { + return *reinterpret_cast(&x); + } + void link(index_t node) { if (connection_count == MAX_CONNECTIONS) { logging::Info("[wb] Too many connections! Node at (%.2f %.2f %.2f)", x, y, z); @@ -98,11 +99,28 @@ bool node_good(index_t node) { } -CatVar pause_recording(CV_SWITCH, "wb_recording_paused", "0", "Pause recording", "Use BindToggle with this"); +index_t CreateNode(const Vector& xyz) { + index_t node = state::free_node(); + logging::Info("[wb] Creating node %u at (%.2f %.2f %.2f)", node, xyz.x, xyz.y, xyz.z); + auto& n = state::nodes[node]; + n.xyz() = xyz; + n.preferred = INVALID_NODE; + n.connection_count = 0; + n.flags |= NF_GOOD; + return node; +} + +CatVar active_recording(CV_SWITCH, "wb_recording", "0", "Do recording", "Use BindToggle with this"); CatVar draw_info(CV_SWITCH, "wb_info", "1", "Walkbot info"); CatVar draw_path(CV_SWITCH, "wb_path", "1", "Walkbot path"); CatVar draw_nodes(CV_SWITCH, "wb_nodes", "1", "Walkbot nodes"); CatVar draw_indices(CV_SWITCH, "wb_indices", "1", "Node indices"); +CatVar spawn_distance(CV_FLOAT, "wb_node_spawn_distance", "32", "Node spawn distance"); + +CatCommand c_start_recording("wb_record", "Start recording", []() { state::state = WB_RECORDING; }); +CatCommand c_start_editing("wb_edit", "Start editing", []() { state::state = WB_EDITING; }); +CatCommand c_start_replaying("wb_replay", "Start replaying", []() { state::state = WB_REPLAYING; }); +CatCommand c_exit("wb_exit", "Exit", []() { state::state = WB_DISABLED; }); // Selects closest node, clears selection if node is selected CatCommand c_select_node("wb_select", "Select node", []() { @@ -128,14 +146,8 @@ CatCommand c_delete_node("wb_delete", "Delete node", []() { }); // Creates a new node under your feet and connects it to closest node to your crosshair CatCommand c_create_node("wb_create", "Create node", []() { - const Vector& origin = LOCAL_E->m_vecOrigin; - index_t node = state::free_node(); - logging::Info("[wb] Creating node %u at (%.2f %.2f %.2f)", node, origin.x, origin.y, origin.z); + index_t node = CreateNode(g_pLocalPlayer->v_Origin); auto& n = state::nodes[node]; - n.xyz = origin; - n.preferred = INVALID_NODE; - n.connection_count = 0; - n.flags |= NF_GOOD; if (g_pUserCmd->buttons & IN_DUCK) n.flags |= NF_DUCK; if (state::node_good(state::closest_node)) { @@ -245,7 +257,7 @@ void UpdateClosestNode() { if (not node.flags & NF_GOOD) continue; - float fov = GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, node.xyz); + float fov = GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, node.xyz()); if (fov < n_fov) { n_fov = fov; n_idx = i; @@ -268,7 +280,7 @@ void DrawConnection(index_t a, index_t b) { const auto& b_ = state::nodes[b]; Vector wts_a, wts_b; - if (not (draw::WorldToScreen(a_.xyz, wts_a) and draw::WorldToScreen(b_.xyz, wts_b))) + if (not (draw::WorldToScreen(a_.xyz(), wts_a) and draw::WorldToScreen(b_.xyz(), wts_b))) return; rgba_t* color = &colors::white; @@ -304,7 +316,7 @@ void DrawNode(index_t node, bool draw_back) { else if (n.flags & NF_DUCK) color = &colors::green; Vector wts; - if (not draw::WorldToScreen(n.xyz, wts)) + if (not draw::WorldToScreen(n.xyz(), wts)) return; size_t node_size = 2; @@ -322,13 +334,50 @@ void DrawNode(index_t node, bool draw_back) { else if (n.flags & NF_DUCK) color = &colors::green; Vector wts; - if (not draw::WorldToScreen(n.xyz, wts)) + if (not draw::WorldToScreen(n.xyz(), wts)) return; FTGL_Draw(std::to_string(node), wts.x, wts.y, fonts::ftgl_ESP, *color); } } +bool ShouldSpawnNode() { + if (not state::node_good(state::active_node)) + return true; + + bool was_jumping = state::last_node_buttons & IN_JUMP; + bool is_jumping = g_pUserCmd->buttons & IN_JUMP; + + if (was_jumping != is_jumping and is_jumping) + return true; + + if ((state::last_node_buttons & IN_DUCK) != (g_pUserCmd->buttons & IN_DUCK)) + return true; + + auto& node = state::nodes[state::active_node]; + + if (node.xyz().DistTo(g_pLocalPlayer->v_Origin) > float(spawn_distance)) { + return true; + } + + return false; +} + +void RecordNode() { + index_t node = CreateNode(g_pLocalPlayer->v_Origin); + auto& n = state::nodes[node]; + if (g_pUserCmd->buttons & IN_DUCK) + n.flags |= NF_DUCK; + if (state::node_good(state::active_node)) { + auto& c = state::nodes[state::active_node]; + n.link(state::active_node); + c.link(node); + logging::Info("[wb] Node %u auto-linked to node %u at (%.2f %.2f %.2f)", node, state::active_node, c.x, c.y, c.z); + } + state::last_node_buttons = g_pUserCmd->buttons; + state::active_node = node; +} + void DrawPath() { for (index_t i = 0; i < state::nodes.size(); i++) { DrawNode(i, false); @@ -340,24 +389,25 @@ void Draw() { switch (state::state) { case WB_RECORDING: { AddSideString("Walkbot: Recording"); - } break; case WB_EDITING: { AddSideString("Walkbot: Editing"); - } break; case WB_REPLAYING: { AddSideString("Walkbot: Replaying"); - } break; } + if (draw_path) + DrawPath(); } void Move() { if (state::state == WB_DISABLED) return; switch (state::state) { case WB_RECORDING: { - + if (active_recording and ShouldSpawnNode()) { + RecordNode(); + } } break; case WB_EDITING: { UpdateClosestNode(); diff --git a/src/hacks/hacklist.h b/src/hacks/hacklist.h index ad061db0..8dcaffbb 100644 --- a/src/hacks/hacklist.h +++ b/src/hacks/hacklist.h @@ -18,6 +18,7 @@ #include "Bunnyhop.h" #include "ESP.h" #include "LagExploit.hpp" +#include "Walkbot.hpp" #include "AntiBackstab.hpp" #include "AutoBackstab.hpp" #include "FollowBot.h"