From 22b9ee97266d0592a2fb447d4f766de6f820606e Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 7 Feb 2026 23:34:28 -0800 Subject: [PATCH] Reduce collision trapping and improve /unstuck Add root, branch, thorn, moss, ivy, and other natural doodads to the no-block foliage list. /unstuck now moves the player 5 units forward instead of resetting in place. --- src/core/application.cpp | 11 ++++++++--- src/game/game_handler.cpp | 2 +- src/rendering/m2_renderer.cpp | 11 ++++++++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/core/application.cpp b/src/core/application.cpp index 43d45702..9537060c 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -1,6 +1,7 @@ #include "core/application.hpp" #include "core/coordinates.hpp" #include +#include #include "core/spawn_presets.hpp" #include "core/logger.hpp" #include "rendering/renderer.hpp" @@ -539,14 +540,18 @@ void Application::setupUICallbacks() { loadOnlineWorldTerrain(mapId, x, y, z); }); - // Unstuck callback — re-run spawn search at current XY to find valid floor + // Unstuck callback — move 5 units forward (based on facing) and re-snap to floor gameHandler->setUnstuckCallback([this]() { if (!renderer || !renderer->getCameraController()) return; auto* cc = renderer->getCameraController(); auto* ft = cc->getFollowTargetMutable(); if (!ft) return; - // Use reset() which does a full multi-radius WMO/terrain floor search - cc->setDefaultSpawn(*ft, cc->getYaw(), cc->getPitch()); + // Move 5 units in the direction the player is facing + float yaw = cc->getYaw(); + ft->x += 5.0f * std::sin(yaw); + ft->y += 5.0f * std::cos(yaw); + // Re-snap to floor at the new position + cc->setDefaultSpawn(*ft, yaw, cc->getPitch()); cc->reset(); }); diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index b1ece5ea..55a1eda3 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -4014,7 +4014,7 @@ void GameHandler::useItemById(uint32_t itemId) { void GameHandler::unstuck() { if (unstuckCallback_) { unstuckCallback_(); - addSystemChatMessage("Unstuck: position reset to floor."); + addSystemChatMessage("Unstuck: moved 5 units forward."); } } diff --git a/src/rendering/m2_renderer.cpp b/src/rendering/m2_renderer.cpp index afdb592a..77fc24ad 100644 --- a/src/rendering/m2_renderer.cpp +++ b/src/rendering/m2_renderer.cpp @@ -715,7 +715,16 @@ bool M2Renderer::loadModel(const pipeline::M2Model& model, uint32_t modelId) { (lowerName.find("fireflys") != std::string::npos) || (lowerName.find("mushroom") != std::string::npos) || (lowerName.find("fungus") != std::string::npos) || - (lowerName.find("toadstool") != std::string::npos); + (lowerName.find("toadstool") != std::string::npos) || + (lowerName.find("root") != std::string::npos) || + (lowerName.find("branch") != std::string::npos) || + (lowerName.find("thorn") != std::string::npos) || + (lowerName.find("moss") != std::string::npos) || + (lowerName.find("ivy") != std::string::npos) || + (lowerName.find("seaweed") != std::string::npos) || + (lowerName.find("kelp") != std::string::npos) || + (lowerName.find("cattail") != std::string::npos) || + (lowerName.find("reed") != std::string::npos); bool treeLike = (lowerName.find("tree") != std::string::npos); foliageOrTreeLike = (foliageName || treeLike); bool hardTreePart =