From 9cf6a340f2a7b6a2d08d4d23e1f713fd82463bf1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 12 Sep 2019 11:06:42 +0800 Subject: [PATCH] 1 --- server/gameserver/CMakeLists.txt | 2 +- server/gameserver/entity.cc | 84 -------------------------------- server/gameserver/entity.h | 1 - server/gameserver/human.cc | 64 ++++++++++++++++++++++++ server/gameserver/human.h | 1 + 5 files changed, 66 insertions(+), 86 deletions(-) diff --git a/server/gameserver/CMakeLists.txt b/server/gameserver/CMakeLists.txt index e03a6cb..6bd1935 100644 --- a/server/gameserver/CMakeLists.txt +++ b/server/gameserver/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.8) set(GAME_ID 2001) set(CMAKE_BUILD_TYPE "Debug") -set(CMAKE_BUILD_TYPE "Release") +#set(CMAKE_BUILD_TYPE "Release") set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID}") set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID}") diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index d2b2a24..8473162 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -83,90 +83,6 @@ void Entity::ClearColliders() colliders.clear(); } -void Entity::FindLocationWithTarget(Entity* target) -{ - a8::Vec2 old_pos = pos; - a8::Vec2 new_pos = pos; - AabbCollider a_collider; - GetAabbBox(a_collider); - AabbCollider target_collider; - target->GetAabbBox(target_collider); - { - bool ret = a_collider.CalcSafePoint(&target_collider, new_pos); - if (!ret) { - abort(); - } - } - a8::Vec2 new_pos_dir = new_pos - old_pos; - new_pos_dir.Normalize(); - float distance = (new_pos - old_pos).Norm(); - for (int i = distance; i < 10000000; i += 5) { - pos = old_pos + new_pos_dir * i; - - Entity* building = nullptr; - std::set new_grid_list; - room->grid_service.GetAllCellsByXy(pos.x, pos.y, new_grid_list); - for (auto& grid : new_grid_list) { - for (Entity* entity : grid->entity_list) { - switch (entity->entity_type) { - case ET_Building: - { - if (TestCollision(entity)) { - building = entity; - } - } - break; - default: - break; - } - if (building) { - break; - } - } - if (building) { - break; - } - } - - if (!building) { - bool is_collision = false; - std::set colliders; - room->map_service.GetColliders(pos.x, pos.y, colliders); - for (ColliderComponent* collider : colliders) { - if (TestCollision(collider)) { - is_collision = true; - break; - } - } - if (!is_collision) { - break; - } - } - } - - room->grid_service.RemoveFromGridList(grid_list, this); - { - grid_list.clear(); - switch (entity_type) { - case ET_Player: - { - room->grid_service.AddHuman((Human*)this); - } - break; - case ET_Bullet: - { - room->grid_service.AddBullet((Bullet*)this); - } - break; - default: - { - room->grid_service.AddEntity(this); - } - break; - } - } -} - void Entity::BroadcastFullState() { std::set grid_list; diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index de4da75..f13b777 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -44,7 +44,6 @@ class Entity bool TestCollision(Entity* b); bool TestCollision(ColliderComponent* b); bool TestCollisionEx(const a8::Vec2& aabb_pos, AabbCollider& aabb_box); - void FindLocationWithTarget(Entity* target); void BroadcastFullState(); void BroadcastDeleteState(); void AddCollider(ColliderComponent* collider); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index dc015b9..752db09 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2387,3 +2387,67 @@ void Human::ProcLootSkin(Loot* entity, MetaData::Equip* item_meta) } } } + +void Human::FindLocationWithTarget(Entity* target) +{ + a8::Vec2 old_pos = pos; + a8::Vec2 new_pos = pos; + AabbCollider a_collider; + GetAabbBox(a_collider); + AabbCollider target_collider; + target->GetAabbBox(target_collider); + { + bool ret = a_collider.CalcSafePoint(&target_collider, new_pos); + if (!ret) { + abort(); + } + } + a8::Vec2 new_pos_dir = new_pos - old_pos; + new_pos_dir.Normalize(); + float distance = (new_pos - old_pos).Norm(); + for (int i = distance; i < 10000000; i += 5) { + pos = old_pos + new_pos_dir * i; + room->grid_service.MoveHuman(this); + + Entity* building = nullptr; + std::set new_grid_list; + room->grid_service.GetAllCellsByXy(pos.x, pos.y, new_grid_list); + for (auto& grid : new_grid_list) { + for (Entity* entity : grid->entity_list) { + switch (entity->entity_type) { + case ET_Building: + { + if (TestCollision(entity)) { + building = entity; + } + } + break; + default: + break; + } + if (building) { + break; + } + } + if (building) { + break; + } + } + + if (!building) { + bool is_collision = false; + std::set colliders; + room->map_service.GetColliders(pos.x, pos.y, colliders); + for (ColliderComponent* collider : colliders) { + if (TestCollision(collider)) { + is_collision = true; + break; + } + } + if (!is_collision) { + break; + } + } + } +} + diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 73abc10..c5a1265 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -225,6 +225,7 @@ private: void DeadDrop(); void FillSMGameOver(cs::SMGameOver& msg); void SendBattleReport(); + void FindLocationWithTarget(Entity* target); protected: long long last_shot_frameno_ = 0;