diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d6c40c7..cee317d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -41,24 +41,31 @@ static void InternalCreateBullet(BulletInfo& bullet_info) if (c->downed) { return; } - if (c->GetCurrWeapon()->weapon_idx == 0) { - return; - } - if (c->GetCurrWeapon()->meta->i->bullet_consume_type() == kBulletConsumeMulti) { - if (c->GetCurrWeapon()->ammo <= 0) { + if (bullet_info.delay_time <= 0) { + if (c->GetCurrWeapon()->weapon_idx == 0) { return; } - --c->GetCurrWeapon()->ammo; - } - if (bullet_info.delay_time <= 0) { + if (c->GetCurrWeapon()->meta->i->bullet_consume_type() == kBulletConsumeMulti) { + if (c->GetCurrWeapon()->ammo <= 0) { + return; + } + --c->GetCurrWeapon()->ammo; + if (c->GetCurrWeapon()->ammo <= 0) { + c->AutoLoadingBullet(); + } + if ((c->IsPlayer() || c->IsCar())) { + c->room->frame_event.AddBulletNumChg(c->GetWeakPtrRef()); + c->room->frame_event.AddWeaponAmmoChg(c->GetWeakPtrRef()); + } + } + if (bullet_info.recoil_force > 0) { + c->DoRecoilForce(bullet_info.recoil_force); + bullet_info.bullet_born_pos = bullet_info.bullet_born_pos - + (bullet_info.bullet_dir * bullet_info.recoil_force); + } int bullet_uniid = 0; if (MetaMgr::Instance()->prebattle_can_use_skill || !(c->HasBuffEffect(kBET_Jump) || c->HasBuffEffect(kBET_Fly))) { - if (bullet_info.recoil_force > 0) { - c->DoRecoilForce(bullet_info.recoil_force); - bullet_info.bullet_born_pos = bullet_info.bullet_born_pos - - (bullet_info.bullet_dir * bullet_info.recoil_force); - } bullet_uniid = c->room->CreateBullet (c, c->shot_passenger, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 50782d2..1b328c9 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1574,7 +1574,12 @@ void Human::_UpdateSpecMove() void Human::_UpdateMove(int speed) { - if (!HasBuffEffect(kBET_Vertigo)) { + if (HasBuffEffect(kBET_Vertigo)) { + if (!HasBuffEffect(kBET_Recoil)) { + return; + } + } + { a8::UnSetBitFlag(status, CS_Collisioning); do { int distance = std::min(5, speed);