From 88667d401552d4993b582c0ff343e792c77ac2e9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 6 Aug 2021 09:39:23 +0000 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 4 +++- server/gameserver/car.cc | 23 +++++++++++++++++++++++ server/gameserver/car.h | 5 +++++ server/gameserver/hero.cc | 3 ++- server/gameserver/human.cc | 2 +- server/gameserver/obstacle.cc | 1 + 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 386bfb6..e357439 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -100,7 +100,9 @@ void Bullet::ProcBomb() } c4_target = c->AsCar(); } - if (TestCollision(room, c)) { + AabbCollider aabb_box; + c->GetHitAabbBox(aabb_box); + if (TestCollision(room, &aabb_box)) { objects.insert(c); } } diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 7de886b..b127dec 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -32,6 +32,7 @@ void Car::Initialize() if (!hero_meta_) { abort(); } + RecalcSelfCollider(); MetaData::Equip* weapon_meta = MetaMgr::Instance()->GetEquip(hero_meta_->i->default_weapon()); if (weapon_meta) { weapons[GUN_SLOT1].weapon_idx = GUN_SLOT1; @@ -374,6 +375,17 @@ void Car::GetAabbBox(AabbCollider& aabb_box) aabb_box._max.y = hero_meta_->i->radius(); } +void Car::GetHitAabbBox(AabbCollider& aabb_box) +{ + aabb_box.active = true; + aabb_box.owner = this; + aabb_box._min.x = -hero_meta_->i->hit_radius(); + aabb_box._min.y = -hero_meta_->i->hit_radius(); + aabb_box._max.x = hero_meta_->i->hit_radius(); + aabb_box._max.y = hero_meta_->i->hit_radius(); + aabb_box.MoveCenter(hero_meta_->i->hit_offset_x(), hero_meta_->i->hit_offset_y()); +} + void Car::SendDebugMsg(const std::string& debug_msg) { #if 1 @@ -419,3 +431,14 @@ void Car::DropItems(Obstacle* obstacle) room->ScatterDrop(obstacle->GetPos(), obstacle->meta->i->drop()); } } + +void Car::RecalcSelfCollider() +{ + if (!self_collider_) { + self_collider_ = new CircleCollider(); + self_collider_->owner = this; + AddEntityCollider(self_collider_); + } + self_collider_->pos = a8::Vec2(hero_meta_->i->move_offset_x(), hero_meta_->i->move_offset_y()); + self_collider_->rad = hero_meta_->i->radius(); +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index c4cf94e..271dd30 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -12,6 +12,7 @@ namespace MetaData class Human; class Room; +class CircleCollider; class Car : public Creature { public: @@ -26,6 +27,7 @@ class Car : public Creature virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; virtual void OnBulletHit(Bullet* bullet) override; virtual void GetAabbBox(AabbCollider& aabb_box) override; + virtual void GetHitAabbBox(AabbCollider& aabb_box) override; bool IsDriver(Human* hum) { return driver_ == hum && driver_; } Human* GetPassengerBySeat(int seat); @@ -50,6 +52,8 @@ class Car : public Creature int AllocSeat(); void BeKill(int killer_id, const std::string& killer_name, int weapon_id); bool IsPassenger(Human* hum); + void RecalcSelfCollider(); + private: long long born_frameno_ = 0; bool later_removed_ = false; @@ -58,4 +62,5 @@ class Car : public Creature int cur_buff_id_ = 0; int cur_buff_idx_ = -1; float cur_oil_ = 0; + CircleCollider* self_collider_ = nullptr; }; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index dfecb0e..74d245b 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -175,7 +175,7 @@ void Hero::RecalcSelfCollider() self_collider_->owner = this; AddEntityCollider(self_collider_); } - self_collider_->pos = a8::Vec2(); + self_collider_->pos = a8::Vec2(meta->i->move_offset_x(), meta->i->move_offset_y()); self_collider_->rad = meta->i->radius(); } @@ -215,6 +215,7 @@ void Hero::GetHitAabbBox(AabbCollider& aabb_box) aabb_box._min.y = -GetHitRadius(); aabb_box._max.x = GetHitRadius(); aabb_box._max.y = GetHitRadius(); + aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y()); } void Hero::DetachFromMaster() diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9b5f922..34d6376 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -491,7 +491,7 @@ void Human::RecalcSelfCollider() self_collider_->owner = this; AddEntityCollider(self_collider_); } - self_collider_->pos = a8::Vec2(); + self_collider_->pos = a8::Vec2(meta->i->move_offset_x(), meta->i->move_offset_y()); self_collider_->rad = meta->i->radius(); Buff* buff = GetBuffByEffectId(kBET_Car); if (buff) { diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index b27e8af..e3f2e2a 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -877,6 +877,7 @@ bool Obstacle::ProcSpecEvent(Creature* c, ColliderComponent* collider) switch (meta->i->thing_type()) { case kObstacleSpring: { + return false; if (c->IsHuman()) { if (!c->AsHuman()->GetCar()) { AddObstacleBuff(c);