From 409eaf6efe81871fead1eca72fef3f64d411b554 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 5 Jan 2023 13:03:15 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 12 ++++- server/gameserver/creature.cc | 77 ++++++++++++++++---------------- server/gameserver/mapinstance.cc | 4 +- 3 files changed, 50 insertions(+), 43 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index fe122d40..ae378d37 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -969,10 +969,20 @@ void Bullet::Raycast() sender.Get()->room->map_instance->Scale(start); sender.Get()->room->map_instance->Scale(end); bool ret = sender.Get()->room->map_instance->Raycast(0, start, end, hit_point, hit_result); - if (ret) { + if (ret && hit_result) { raycast_hited = true; sender.Get()->room->map_instance->UnScale(hit_point); raycast_hit_point_ = hit_point; raycast_len_ = GlmHelper::Norm(hit_point - born_pos.ToGlmVec3()); } + #ifdef DEBUG + a8::XPrintf("bullet.raycast ret:%d hit_result:%d raycast_hit_point_:%f,%f,%f\n", + { + ret, + hit_result, + raycast_hit_point_.x, + raycast_hit_point_.y, + raycast_hit_point_.z, + }); + #endif } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 76c8e869..4e77422c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2546,22 +2546,20 @@ void Creature::AutoNavigation(const glm::vec3& target_pos, float speed, struct NavContext { CreatureWeakPtr c; - Position src_pos; + glm::vec3 src_pos; glm::vec3 target_pos; glm::vec3 dir; int exec_frameno = 0; float speed = 0.0f; - float distance = 0.0f; std::function cb; }; std::shared_ptr context = std::make_shared(); context->c = GetWeakPtrRef(); - context->src_pos = GetPos(); + context->src_pos = GetPos().ToGlmVec3(); context->target_pos = target_pos; context->dir = target_pos - GetPos().ToGlmVec3(); GlmHelper::Normalize(context->dir); context->speed = speed; - context->distance = distance; context->cb = cb; IncDisableMoveTimes(); @@ -2571,46 +2569,47 @@ void Creature::AutoNavigation(const glm::vec3& target_pos, float speed, { if (a8::TIMER_EXEC_EVENT == event) { ++context->exec_frameno; + if (context->c.Get()) { + Room* room = context->c.Get()->room; + Creature* c = context->c.Get(); - Room* room = context->c.Get()->room; - Creature* c = context->c.Get(); - - glm::vec3 dir = context->target_pos - c->GetPos().ToGlmVec3(); - GlmHelper::Normalize(dir); - Position old_pos = c->GetPos(); - float move_length = context->speed / (float)SERVER_FRAME_RATE; - float move_distance = std::min(move_length * context->exec_frameno, context->distance); - Position new_pos = context->src_pos; - new_pos.AddGlmVec3(dir * move_distance); - Global::Instance()->verify_set_pos = 1; - c->SetPos(new_pos); - Global::Instance()->verify_set_pos = 0; + glm::vec3 curr_pos = context->src_pos + + context->dir * (context->speed / FRAME_RATE_MS) * (float)context->exec_frameno; + Global::Instance()->verify_set_pos = 1; + c->GetMutablePos().FromGlmVec3(curr_pos); + Global::Instance()->verify_set_pos = 0; + room->grid_service->MoveCreature(c); + bool ok = false; + if (GlmHelper::Norm(context->target_pos - context->src_pos) <= + GlmHelper::Norm(curr_pos - context->src_pos)) { + Global::Instance()->verify_set_pos = 1; + c->GetMutablePos().FromGlmVec3(context->target_pos); + Global::Instance()->verify_set_pos = 0; + ok = true; + } #ifdef DEBUG - a8::XPrintf("speed:%d src_pos:%f,%f,%f new_pos:%f,%f,%f move_distance:%f src_distance:%f " - "target_pos:%f,%f,%f\n", - { - context->speed, - context->src_pos.x, - context->src_pos.y, - context->src_pos.z, - new_pos.x, - new_pos.y, - new_pos.z, - move_distance, - context->distance, - context->target_pos.x, - context->target_pos.y, - context->target_pos.z - }); + a8::XPrintf("speed:%d src_pos:%f,%f,%f curr_pos:%f,%f,%f " + "target_pos:%f,%f,%f\n", + { + context->speed, + context->src_pos.x, + context->src_pos.y, + context->src_pos.z, + curr_pos.x, + curr_pos.y, + curr_pos.z, + context->target_pos.x, + context->target_pos.y, + context->target_pos.z + }); #endif - bool ok = std::abs(move_distance - context->distance) < 0.0001f; - room->grid_service->MoveCreature(c); - if (ok || c->dead) { - context->cb(c); - c->DecDisableMoveTimes(); - room->xtimer.DeleteCurrentTimer(); + if (ok || c->dead) { + context->cb(c); + c->DecDisableMoveTimes(); + room->xtimer.DeleteCurrentTimer(); + } } } }, diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 4c7ae4cb..a7922a2d 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -435,7 +435,7 @@ bool MapInstance::Raycast(int layer, const glm::vec3& start, const glm::vec3& en memset(hit_normal_, 0, sizeof(hit_normal_)); navmesh_query_->raycast(startRef, spos, epos, &filter, &t, hit_normal_, polys_, &npolys, MAX_POLYS); -#ifdef DEBUG1 +#ifdef DEBUG { std::string dbg_data = a8::Format("npolys:%d t:%f ", {npolys, t}); for (int i = 0; i < npolys; ++i) { @@ -485,8 +485,6 @@ bool MapInstance::Raycast(int layer, const glm::vec3& start, const glm::vec3& en } } if (!ok){ - ok = true; - } else { for (int i = 0; i < 3; ++i) { hit_pos_copy[0] -= dir.x; hit_pos_copy[2] -= dir.z;