From e8db19c214f221ecf27785cf2743977fdb4f8d0d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 11 Nov 2019 15:40:33 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 45 +++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e9222f0..cbda3d1 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include #include @@ -409,7 +411,8 @@ bool Human::IsCollisionInMapService() std::set colliders; room->map_service.GetColliders(pos.x, pos.y, colliders); - for (const ColliderComponent* collider : colliders) { + Global::last_collider = nullptr; + for (ColliderComponent* collider : colliders) { switch (collider->owner->entity_type) { case ET_Obstacle: { @@ -437,6 +440,7 @@ bool Human::IsCollisionInMapService() } obstacle->BroadcastFullState(); } else { + Global::last_collider = collider; return true; } } @@ -447,6 +451,7 @@ bool Human::IsCollisionInMapService() { if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) { if (last_collision_door != collider->owner) { + Global::last_collider = collider; return true; } } @@ -462,6 +467,44 @@ bool Human::IsCollisionInMapService() void Human::FindPathInMapService() { a8::Vec2 old_pos = pos; + ColliderComponent* last_collider = Global::last_collider; + if (last_collider) { + switch (last_collider->type) { + case CT_Aabb: + { + } + break; + case CT_Circle: + { + a8::Vec2 extend_dir = pos - last_collider->owner->pos; + if (std::abs(extend_dir.x) > FLT_EPSILON || + std::abs(extend_dir.y) > FLT_EPSILON) { + extend_dir.Normalize(); + { + #if 0 + a8::Vec2 extend_dir_inverse(extend_dir.y, extend_dir.x); + float angle = extend_dir_inverse.CalcAngle(move_dir); + if (angle > 0.001f) { + extend_dir.Rotate(-1/180.0f); + } else { + extend_dir.Rotate(1/180.0f); + } + #endif + extend_dir.Rotate(1/180.0f); + } + float distance = ((CircleCollider*)last_collider)->rad + meta->i->radius(); + pos = last_collider->owner->pos + extend_dir * (distance + 1); + if (IsCollisionInMapService()) { + pos = old_pos; + } + } + return; + } + break; + default: + break; + } + } { float up_dot = a8::Vec2::UP.Dot(move_dir); bool at_left_side = a8::Vec2::LEFT.Dot(move_dir) > 0.0001f;