diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 7cf9c1e..38c3b3e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -161,6 +161,14 @@ void Human::Shot(Vector2D& target_dir) #if 1 float fly_distance = 5; #endif + for (auto& tuple : curr_weapon->meta->bullet_born_offset) { + Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); + bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); + Vector2D bullet_born_pos = pos + bullet_born_offset; + if (room->OverBorder(bullet_born_pos, 0)) { + return; + } + } room->frame_event.AddShot(this); for (auto& tuple : curr_weapon->meta->bullet_born_offset) { Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 4159388..4afa8f1 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -438,11 +438,19 @@ void Player::Shot() return; } - room->frame_event.AddShot(this); if (room->gas_data.gas_mode != GasInactive && !a8::HasBitFlag(status, HS_Fly) && !a8::HasBitFlag(status, HS_Jump) ) { + for (auto& tuple : curr_weapon->meta->bullet_born_offset) { + Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); + bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); + Vector2D bullet_born_pos = pos + bullet_born_offset; + if (room->OverBorder(bullet_born_pos, 0)) { + return; + } + } + room->frame_event.AddShot(this); for (auto& tuple : curr_weapon->meta->bullet_born_offset) { Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); @@ -456,6 +464,8 @@ void Player::Shot() room->frame_event.AddBullet(this, bullet_born_pos, bullet_dir, fly_distance); room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, bullet_dir, fly_distance); } + } else { + return; } if (curr_weapon->weapon_idx != 0) { --curr_weapon->ammo;