diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index ba69330..e6ba0ad 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -299,20 +299,7 @@ void Buff::ProcRemoveDriver() void Buff::ProcPassenger() { hold_curr_weapon_idx_ = caster_.Get()->GetCurrWeapon()->weapon_idx; - if (caster_.Get()->IsHuman()) { - Human* hum = (Human*)caster_.Get(); - if (hum->GetCar() && hum->GetCar()->GetCurrWeapon()) { - hold_weapons_.push_back(hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx]); - hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx] = *hum->GetCar()->GetCurrWeapon(); - hum->SetCurrWeapon(&hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx]); - if (hum->GetCar()->meta && - hum->GetSeat() < hum->GetCar()->meta->shoot_offsets.size() && - std::get<0>(hum->GetCar()->meta->shoot_offsets[hum->GetSeat()]) - ) { - hum->shoot_offset = std::get<1>(hum->GetCar()->meta->shoot_offsets[hum->GetSeat()]); - } - } - } + CalcPassengerShotOffset(); caster_.Get()->need_sync_active_player = true; caster_.Get()->SyncAroundPlayers(__FILE__, __LINE__, __func__); } @@ -653,3 +640,21 @@ void Buff::ProcAISeting() { } + +void Buff::CalcPassengerShotOffset() +{ + if (meta->i->buff_effect() == kBET_Passenger && caster_.Get()->IsHuman()) { + Human* hum = (Human*)caster_.Get(); + if (hum->GetCar() && hum->GetCar()->GetCurrWeapon()) { + hold_weapons_.push_back(hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx]); + hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx] = *hum->GetCar()->GetCurrWeapon(); + hum->SetCurrWeapon(&hum->weapons[hum->GetCar()->GetCurrWeapon()->weapon_idx]); + if (hum->GetCar()->meta && + hum->GetSeat() < hum->GetCar()->meta->shoot_offsets.size() && + std::get<0>(hum->GetCar()->meta->shoot_offsets[hum->GetSeat()]) + ) { + hum->shoot_offset = std::get<1>(hum->GetCar()->meta->shoot_offsets[hum->GetSeat()]); + } + } + } +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 99e5dcf..bb036ad 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -74,6 +74,8 @@ class Buff void ProcDisperse(); void ProcAISeting(); + void CalcPassengerShotOffset(); + private: void InternalTimerAddBuff(); void RecoverHoldWeapons(); diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 189a6b1..7de886b 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -213,6 +213,10 @@ void Car::SwitchSeat(Human* passenger, int seat) driver_ = nullptr; passenger->RemoveBuffByEffectId(kBET_Driver); passenger->MustBeAddBuff(passenger, PASSENGER_BUFFID); + } else { + Buff* buff = passenger->GetBuffByEffectId(kBET_Passenger); + buff->CalcPassengerShotOffset(); + passenger->need_sync_active_player = true; } room->frame_event.AddCarChg(passenger->GetWeakPtrRef()); SyncAroundPlayers(__FILE__, __LINE__, __func__);