diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index a5f6009..47477bc 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -4,6 +4,7 @@ #include "metamgr.h" #include "movement.h" #include "room.h" +#include "collider.h" Bullet::Bullet():Entity() { @@ -19,6 +20,7 @@ Bullet::~Bullet() void Bullet::Initialize() { + RecalcSelfCollider(); } void Bullet::Update(int delta_time) @@ -31,3 +33,13 @@ void Bullet::Update(int delta_time) room->AddDeletedObject(objects[0]->entity_uniid); } } + +void Bullet::RecalcSelfCollider() +{ + if (!self_collider_) { + self_collider_ = new CircleCollider(); + colliders.push_back(self_collider_); + } + self_collider_->pos = Vector2D(); + self_collider_->rad = meta->i->bullet_rad(); +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 291adea..479f235 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -9,6 +9,7 @@ namespace MetaData } class Human; +class CircleCollider; class Bullet : public Entity { public: @@ -22,4 +23,9 @@ class Bullet : public Entity virtual ~Bullet() override; virtual void Initialize() override; virtual void Update(int delta_time) override; + void RecalcSelfCollider(); + +private: + CircleCollider* self_collider_ = nullptr; + }; diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index a7cae5c..4c49a06 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -30,5 +30,12 @@ Entity::~Entity() bool Entity::TestCollision(Entity* b) { - return false; + for (auto& a_collider : b->colliders) { + for (auto& b_collider : b->colliders) { + if (a_collider->Intersect(b_collider)) { + return false; + } + } + } + return true; } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 597ea8f..6444df0 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -6,6 +6,7 @@ #include "metamgr.h" #include "room.h" #include "bullet.h" +#include "collider.h" Human::Human() { @@ -26,6 +27,7 @@ void Human::Initialize() helmet_meta = MetaMgr::Instance()->GetEquip(helmet); chest_meta = MetaMgr::Instance()->GetEquip(chest); weapon_meta = MetaMgr::Instance()->GetEquip(weapon); + RecalcSelfCollider(); } float Human::GetSpeed() @@ -101,3 +103,13 @@ void Human::Shot(Vector2D& target_dir) room->AddBullet(bullet); } } + +void Human::RecalcSelfCollider() +{ + if (!self_collider_) { + self_collider_ = new CircleCollider(); + colliders.push_back(self_collider_); + } + self_collider_->pos = Vector2D(); + self_collider_->rad = meta->i->radius(); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e038a82..723e733 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -15,6 +15,7 @@ struct HumanFrameData ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; }; +class CircleCollider; class Human : public Entity { public: @@ -57,5 +58,9 @@ class Human : public Entity virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; void Shot(Vector2D& target_dir); + void RecalcSelfCollider(); + +private: + CircleCollider* self_collider_ = nullptr; }; diff --git a/third_party/tools b/third_party/tools index 0fe613a..23026cb 160000 --- a/third_party/tools +++ b/third_party/tools @@ -1 +1 @@ -Subproject commit 0fe613a85023d94103a013cadcc4927004aab8b4 +Subproject commit 23026cb4e2ec630f6d421f742b65de6752a57b9d