From 01c792509c6c1e3147b84f654fb415672b20bbbf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 24 May 2021 16:03:28 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 35 ++++++++++++++++++++++++++++++++--- server/gameserver/buff.h | 2 ++ server/gameserver/creature.cc | 5 +++++ server/gameserver/human.cc | 5 +++++ server/gameserver/metadata.cc | 18 +++++++++++++++--- server/gameserver/metadata.h | 2 +- server/gameserver/player.cc | 3 +++ 7 files changed, 63 insertions(+), 7 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index d14d49b..1816410 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -220,9 +220,11 @@ void Buff::ProcDriver(Creature* caster) 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->GetCar()->meta->shoot_offsets.empty()) { - hum->shoot_offset = hum->GetCar()->meta->shoot_offsets[0]; - hum->GetCar()->shoot_offset = hum->GetCar()->meta->shoot_offsets[0]; + 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()]); } } } @@ -236,6 +238,33 @@ void Buff::ProcRemoveDriver(Creature* caster) caster->shoot_offset = a8::Vec2(); } +void Buff::ProcPassenger(Creature* caster) +{ + hold_curr_weapon_idx_ = caster->GetCurrWeapon()->weapon_idx; + if (caster->IsHuman()) { + Human* hum = (Human*)caster; + 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()]); + } + } + } + caster->need_sync_active_player = true; + caster->SyncAroundPlayers(__FILE__, __LINE__, __func__); +} + +void Buff::ProcRemovePassenger(Creature* caster) +{ + RecoverHoldWeapons(caster); + caster->shoot_offset = a8::Vec2(); +} + void Buff::RecoverHoldWeapons(Creature* caster) { for (auto& weapon : hold_weapons_) { diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 3331103..c450e92 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -42,6 +42,8 @@ class Buff void ProcRemoveBecome(Creature* caster); void ProcDriver(Creature* caster); void ProcRemoveDriver(Creature* caster); + void ProcPassenger(Creature* caster); + void ProcRemovePassenger(Creature* caster); void ProcSprint(Creature* caster); private: diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 5e4a242..472d6da 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -932,6 +932,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) buff->ProcDriver(caster); } break; + case kBET_Passenger: + { + buff->ProcPassenger(caster); + } + break; default: { } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 906798c..b544228 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3263,6 +3263,11 @@ void Human::OnBuffRemove(Buff& buff) buff.ProcRemoveDriver(this); } break; + case kBET_Passenger: + { + buff.ProcRemovePassenger(this); + } + break; default: break; } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 49d150f..c7e0ec8 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -175,10 +175,22 @@ namespace MetaData for (auto& str : strings) { std::vector strings2; a8::Split(str, strings2, ':'); - assert(strings2.size() == 2); if (strings2.size() >= 2) { - shoot_offsets.push_back(a8::Vec2((float)a8::XValue(strings2[0]).GetDouble(), - (float)a8::XValue(strings2[1]).GetDouble())); + shoot_offsets.push_back(std::make_tuple + (1, + a8::Vec2( + (float)a8::XValue(strings2[0]).GetDouble(), + (float)a8::XValue(strings2[1]).GetDouble()) + ) + ); + } else { + shoot_offsets.push_back(std::make_tuple + (0, + a8::Vec2( + 0.0f, + 0.0f + ) + )); } } } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index cb9b131..d4815d4 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -64,7 +64,7 @@ namespace MetaData const metatable::Equip* i = nullptr; std::vector> bullet_born_offset; - std::vector shoot_offsets; + std::vector> shoot_offsets; std::array volume = {}; int int_param1 = 0; float float_param1 = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 4bc411a..3eb4bef 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -193,11 +193,14 @@ void Player::UpdateShot() if (GetCar() && GetCar()->IsDriver(this)) { bool shot_ok = false; a8::Vec2 target_dir = GetAttackDir(); + a8::Vec2 old_car_shoot_offset = GetCar()->shoot_offset; + GetCar()->shoot_offset = shoot_offset; GetCar()->SetAttackDir(GetAttackDir()); GetCar()->Shot(target_dir, shot_ok, fly_distance); if (!moving) { GetCar()->SetMoveDir(GetAttackDir()); } + GetCar()->shoot_offset = old_car_shoot_offset; shot_start = false; return; } else {