From 5065b6347593c6974946284f09c3c37367de24cf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 18 Aug 2024 17:42:42 +0800 Subject: [PATCH] 1 --- server/gameserver/boxdrop.cc | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/server/gameserver/boxdrop.cc b/server/gameserver/boxdrop.cc index 559612ae..63649c05 100644 --- a/server/gameserver/boxdrop.cc +++ b/server/gameserver/boxdrop.cc @@ -2,6 +2,7 @@ #include +#include #include #include @@ -14,6 +15,7 @@ #include "httpproxy.h" #include "jsondatamgr.h" #include "player.h" +#include "mapinstance.h" #include "mt/MapMode.h" #include "mt/Hero.h" @@ -56,8 +58,35 @@ void BoxDrop::Drop(int num, const glm::vec3& center) for (int i = 0; i < num; ++i) { glm::vec3 dir = GlmHelper::UP; GlmHelper::RotateY(dir, a8::RandAngle()); - const glm::vec3 pos = center + dir * (25.0f + rand() % 50); - room_->CreateObstacle(BOX_ID, pos.x, pos.y, pos.z); + + glm::vec3 born_pos = center; + GlmHelper::Normalize(dir); + glm::vec3 start = born_pos; + room_->map_instance->Scale(start); + + glm::vec3 real_pos = born_pos; + float distance = 25.0f + rand() % 50; + for (int i = 0; i < 4; ++i) { + glm::vec3 end = born_pos + dir * distance; + glm::vec3 hit_point; + bool hit_result = false; + room_->map_instance->Scale(end); + if (room_->map_instance->Raycast(start, + end, + hit_point, + hit_result, + room_->map_instance->GetMoveIncludeFlags(), + room_->map_instance->GetMoveExcludeFlags())) { + room_->map_instance->UnScale(hit_point); + if (GlmHelper::Norm2D(hit_point - born_pos) > 5) { + real_pos = hit_point; + break; + } + } + GlmHelper::RotateY(dir, glm::radians(90.0f)); + } + + room_->CreateObstacle(BOX_ID, real_pos.x, real_pos.y, real_pos.z); } }