diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index fd83dd1..fe3e6fa 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -45,11 +45,20 @@ void Bullet::Update(int delta_time) if (hum != master && !hum->dead && (hum->team_id == 0 || master->team_id != hum->team_id)) { if (hum->TestCollision(&bullet_collider)) { - objects.insert(hum); + if (meta->i->is_through()) { + //可穿透 + if (hited_humans_.find(hum) == hited_humans_.end()) { + hited_humans_.insert(hum); + objects.insert(hum); + } + } else { + objects.insert(hum); + } } } } }//end for + float bullet_range = meta->i->range() + master->ability.shot_range + master->BuffAttrAbs(kHAT_ShotRange); if (!meta->i->is_through()) { std::set colliders; room->map_service.GetColliders(pos.x, pos.y, colliders); @@ -58,15 +67,23 @@ void Bullet::Update(int delta_time) objects.insert(collider->owner); } } - } - float bullet_range = meta->i->range() + master->ability.shot_range + master->BuffAttrAbs(kHAT_ShotRange); - if (!objects.empty() || distance > bullet_range ) { - deleted = true; + if (!objects.empty() || distance > bullet_range ) { + deleted = true; + if (!objects.empty()) { + OnHit(objects); + } + PostAttack(); + room->RemoveObjectLater(this); + } + } else { if (!objects.empty()) { OnHit(objects); } - PostAttack(); - room->RemoveObjectLater(this); + if (distance > bullet_range ) { + deleted = true; + PostAttack(); + room->RemoveObjectLater(this); + } } } } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 4279fd8..9ceb052 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -30,4 +30,7 @@ class Bullet : public Entity void OnHit(std::set& objects); void PostAttack(); + +private: + std::set hited_humans_; };