From 23e9ef0af53a02b8d97129876ce20091744f009b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 28 Mar 2019 19:17:44 +0800 Subject: [PATCH] 1 --- server/gameserver/entity.h | 3 +++ server/gameserver/human.h | 1 + server/gameserver/player.cc | 8 ++++++++ server/gameserver/room.cc | 4 +++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index b36c0b9..28a6522 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -30,6 +30,7 @@ enum EntitySubType_e }; class Room; +class Obstacle; class ColliderComponent; class MovementComponent; class Entity @@ -45,6 +46,8 @@ class Entity std::list colliders; bool deleted = false; + Obstacle* last_collision_door = nullptr; + Entity() {}; virtual ~Entity(); virtual void Initialize() {}; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 35f32f1..00e74e3 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -14,6 +14,7 @@ struct HumanFrameData }; class CircleCollider; +class Obstacle; class Human : public Entity { public: diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 067340a..762347e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -96,6 +96,9 @@ void Player::UpdateMove() break; } } + if (last_collision_door && !TestCollision(last_collision_door)) { + last_collision_door = nullptr; + } } void Player::UpdateShot() @@ -193,6 +196,11 @@ void Player::ObstacleInteraction(Obstacle* entity) for (auto& pair : room->human_hash_) { pair.second->new_objects.insert(entity); pair.second->part_objects.insert(entity); + if (entity->TestCollision(pair.second)) { + pair.second->last_collision_door = entity; + } else if (pair.second->last_collision_door == entity) { + pair.second->last_collision_door = nullptr; + } } } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 46ac92a..b7fcf17 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -285,7 +285,9 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vectorentity_type == ET_Obstacle) { if (sender->entity_type == ET_Bullet || sender->entity_type == ET_Player) { - if (pair.second != sender && sender->TestCollision(pair.second)) { + if (pair.second != sender && + (sender->last_collision_door == nullptr || sender->last_collision_door != pair.second) && + sender->TestCollision(pair.second)) { objects.push_back(pair.second); } }