From 9c83499f0fb1b0e2f26cae89a8c23cbbcb6e29f1 Mon Sep 17 00:00:00 2001 From: neru Date: Tue, 7 Apr 2026 01:28:03 -0300 Subject: [PATCH] feat: spoof bloodweb items --- src/unlocker/spoofing.cpp | 49 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/unlocker/spoofing.cpp b/src/unlocker/spoofing.cpp index 8fc3cd0..aa096f6 100644 --- a/src/unlocker/spoofing.cpp +++ b/src/unlocker/spoofing.cpp @@ -215,7 +215,50 @@ void Spoofer::modifyCharacterData(json& js) } if (js.contains("prestigeLevel") && js["prestigeLevel"].get() <= 1) - if (js.contains("bloodWebLevel") && js["bloodWebLevel"].get() <= 15) js["bloodWebLevel"] = 15; + if (js.contains("bloodWebLevel") && js["bloodWebLevel"].get() <= 15) js["bloodWebLevel"] = 16; + + if (js.contains("bloodWebData")) + { + std::vector paths; + json ringDataArray = json::array(); + + ringDataArray.push_back({{"nodeData", json::array({{{"nodeId", "0"}, {"state", "Collected"}}})}}); + + int nodesPerRing[] = {6, 12, 12}; + std::vector prevRingNodes = {"0"}; + + for (int ring = 1; ring <= 3; ++ring) + { + json nodeDataArray = json::array(); + std::vector currentRingNodes; + int numNodes = nodesPerRing[ring - 1]; + + for (int i = 1; i <= numNodes; ++i) + { + std::string childId = std::to_string((ring * 100) + i); + currentRingNodes.push_back(childId); + + int parentIndex = (i - 1) / (numNodes / static_cast(prevRingNodes.size())); + + if (parentIndex >= prevRingNodes.size()) parentIndex = static_cast(prevRingNodes.size()) - 1; + + std::string parentId = prevRingNodes[parentIndex]; + paths.push_back(parentId + "_" + childId); + + nodeDataArray.push_back( + {{"nodeId", childId}, {"state", "Collected"}, {"contentId", "ADDON_toolbox_socketswivels"}}); + } + + ringDataArray.push_back({{"nodeData", nodeDataArray}}); + prevRingNodes = std::move(currentRingNodes); + } + + js["bloodWebData"]["paths"] = paths; + js["bloodWebData"]["ringData"] = ringDataArray; + + js["bloodWebData"]["paths"] = paths; + js["bloodWebData"]["ringData"] = ringDataArray; + } if (js.contains("characterItems") && js["characterItems"].is_array()) { @@ -392,7 +435,7 @@ void Spoofer::serverResponseHandler(const std::string& url, std::string& body, s { if (charInfo.contains("bloodWebLevel") && charInfo.at("bloodWebLevel").get() <= 15) if (!charInfo.contains("prestigeLevel") || charInfo.at("prestigeLevel").get() <= 0) - charInfo["bloodWebLevel"] = 15; + charInfo["bloodWebLevel"] = 16; if (charInfo.contains("bloodWebData") && charInfo.at("bloodWebData").contains("level")) charInfo["bloodWebData"]["level"] = 1; @@ -433,7 +476,7 @@ void Spoofer::serverResponseHandler(const std::string& url, std::string& body, s json mock; mock["bloodWebLevelChanged"] = false; mock["updatedWallets"] = json::array(); - mock["bloodWebLevel"] = 15; + mock["bloodWebLevel"] = 16; mock["prestigeLevel"] = 0; mock["bloodWebData"] = {{"ringData", json::array()}, {"paths", json::array()}}; mock["characterItems"] = json::array();